实体框架:延迟加载“解决方案”的问题(不询问如何进行延迟加载)

时间:2009-07-02 14:42:14

标签: entity-framework lazy-loading

基本上我基本上将生成的属性设置为私有并且具有处理是否加载生成的属性的公共属性,所以基本上我想出了一个半自行增长的延迟加载解决方案:

 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类中我不能使用Item类中的ParentRoom(proxy)属性,我不能在Room查询的查询中使用它。实体框架无法弄清楚该属性。

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

我能想到的唯一其他选择是将生成的属性设置为内部,并使Room类查询使用ParentRoomInner属性(meh)或将方法(如GetPostCount方法)移动到Item类,并且只需将GetPostCount方法放在房间类指向它。 (也不是很糟糕,只是加倍一种方法)

1 个答案:

答案 0 :(得分:0)

我担心答案是“不”。在.NET 3.5中,没有办法做到这一点。当然,.NET 4.0为您提供延迟加载。

将GetPostCount放在Room上似乎最适合你正在做的事情。