在EF 4.1中加载所有导航属性及其子项的最佳方式是什么

本文关键字:是什么 方式 最佳 属性 导航 EF 加载 | 更新日期: 2023-09-27 18:00:42

我正在尝试获取List<EntityType>,每个项目大约有15个导航属性需要加载,一些导航属性也有一个导航属性也需要加载,这是一个示例代码

class AA
{
  public EntityReference<B> Bobj
  {
     get;
     set;
  }
  public EntityCollection<C> CCollection
  {
     get;
     set;
  }
}
class B
{
  public EntityCollection<X> XCollection
  {
     get;
     set;
  }
}
class C
{
  public EntityReference<Y> YObj
  {
     get;
     set;
  }
}
List<AA> AList = Dbcontext.AAs.Where(a => a.ID==4).ToList();

我希望List<AA>中的每个项目都已加载了其BObj及其XCollection,并且所有CCollection项目均已加载其YObj

我尝试使用IncludeLoad加载它们,但我认为有一种优雅的方法可以实现

我还试图将LazyLoadingEnabled设置为false,但这并不能加载完整的图,我不知道为什么?

所以我需要最好的方法来加载我的EntityType 的完整图形

我使用数据库优先方法EF 4.1C# 4.0

在EF 4.1中加载所有导航属性及其子项的最佳方式是什么

下面是我学到的一个技巧:

List<AA> AList = Dbcontext.AAs.Where(a => a.ID==4)
    .Select(a => new {a, a.Bobj, a.CCollection})
    .ToList().Select(o => o.a).ToList();
Dbcontext.Bs.Where(b => b.A.ID==4)
    .Select(b => new {b, b.XCollection})
    .ToList();
Dbcontext.Cs.Where(c => c.A.ID==4)
    .Select(c => new {c, c.YObj})
    .ToList();

实体框架将弄清楚这些不同的对象是如何连接的。您将进行可管理的往返次数(本例中为3次),生成的SQL查询结果将具有相对较少的重复数据。

关闭延迟加载将阻止它们加载。启用延迟加载并将所有导航属性标记为虚拟,这将允许覆盖它们,以便可以创建动态代理。这将允许延迟加载正常工作。显式加载也是一种选择(许多人认为这是更好的编码实践)。

编辑:哦,对不起,我还以为这是代码优先。然后,如果有帮助的话,由于Include返回一个查询对象,你实际上可以循环遍历它们的列表,并将它们添加到自己中,以动态构建查询。