2009-07-02 35 views
2

所以基本上我想出了一个半家庭成长的解决方案,以延迟加载基本上已生成的属性是私人的,并有一个公共财产,处理与是否加载生成的属性:实体框架:问题与延迟加载“解决方案”(不问如何做懒惰加载)

public ChatRoom ParentRoom 
{ 
    get 
    { 
    if(!ParentRoomInnerReference.IsLoaded) 
    { 
     ParentRoomInnerReference.Load(); 
    } 

    return ParentRoomInner; 
    } 

    set 
    { 
    ParentRoomInner = value; 
    } 
} 

现在,这与类查询效果很好用类似(因为我有在部分类扩展生成的类的所有“查询”用)

context.Items.Where(ParentRoomInner.Id = someId).ToList(); 

由于此方法位于Item类中,因此它可以运行此就好在那里,它不能做的:

context.Items.Where(ParentRoom.Id = someId).ToList(); 

由于实体框架无法弄清楚,代理财产,以产生什么表情。这真的成​​为一个问题是说,我正在尝试计算一个房间的所有帖子(项目),并且我想要Room类上的该方法。

public Int32 GetPostCount() 
{ 
    return EntityContext.Context 
      .ChatItems 
      .Count(item => item.ParentRoom.ChatRoomID == ChatRoomID); //Boom 
} 

Item类,我不能在项目类中使用ParentRoom(代理)属性中同样的原因,我不能在这个查询客房类中使用它。实体框架无法弄清楚该属性。

现在的问题是,是否有某种属性我可能能够标记ParentRoom属性,以便它知道是指ParentRoomInner属性,因此可以知道如何处理它时分解表达式?

我能想到的唯一其他替代方案是将生成的属性设置为内部,并让Room类查询使用ParentRoomInner属性(meh)或将方法(如GetPostCount方法)移动到Item类,并且只需将GetPostCount方法Room类指向它。 (不可怕,但只是双打一种方法)

回答

0

恐怕答案是“不”。在.NET 3.5中,没有办法做到这一点。当然,.NET 4.0会为您提供真实的延迟加载。

把GetPostCount放在房间上似乎是最适合你在做什么的。

+0

遗憾的是,经过彻底搜索,我认为你是对的。 – 2009-07-03 15:36:35