所以基本上我想出了一个半自制的延迟加载解决方案,基本上让生成的属性是私有的,并且有一个公共属性来处理是否加载生成的属性:
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 方法给它。(也不可怕,只是加倍了一种方法)