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

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

我能想到的唯一其他选择是让生成的属性是内部的,让 Room 类查询使用 ParentRoomInner 属性(meh)或将 GetPostCount 方法等方法移动到 Item 类,并且只在 Room 类点上使用 GetPostCount 方法给它。(也不可怕,只是加倍了一种方法)

4

1 回答 1

0

I'm afraid the answer is "no." In .NET 3.5 there's no way to do this. .NET 4.0, of course, gives you lazy loading for real.

Putting GetPostCount on Room seems like the best fit for what you're doing.

于 2009-07-02T20:31:18.517 回答