在实体内显式加载相关实体

Posted

技术标签:

【中文标题】在实体内显式加载相关实体【英文标题】:Explicitly load related entities within entities 【发布时间】:2014-01-16 11:38:59 【问题描述】:

我有如下对象图:

Public ClassA

   public int Id  get; set; 
   public virtual ICollection<ClassB> ClassB_List  get; set; 


Public ClassB

   public int Id  get; set; 
   public virtual ICollection<ClassC> ClassC_List  get; set; 


Public ClassC

   public int Id  get; set; 

现在我想做的是,因为我在 DBContext 级别禁用了延迟加载,对于给定的 ClassA 实例,我想加载所有相关实体(ClassBList 和 ClassCList)。 我可以使用以下方法加载 ClassB_List 的嵌套集合:

context.Entry(classA).Collection("ClassB_List").Load();

但是,我不知道如何在 ClassB_List 中为 ClassC_List 加载每个子项,而不使用像这样的垃圾:

classA.ClassB_List.ToList().ForEach(c => context.Entry(c).Collection("ClassC_List").Load());

我知道我发现的另一种方法是使用 Include() 在上下文中使用预先加载:

var c = context.ClassA_list
                          .Include("ClassB_List.ClassC_List")
                          .ToList();

如果我已经将属性包含在 DBContext 模型中,那么这对于 ClassA 实例列表来说很好,但我不想经常这样做,只想使用显式加载。 有什么想法吗?

【问题讨论】:

【参考方案1】:

您已经使用了两种预加载方式:

包括 加载

如果你想要一些灵活性,你可以这样做:

 var c = context.ClassA_list;

 if (IWantTheRelatedTable)
 
    c = c.Include("ClassB_List.ClassC_List");
 

 var result = c.ToList();

您构建一个 IQueryable,然后在它包含您需要的所有包含时执行它。

【讨论】:

由于我喜欢为单个父实体而不是列表加载相关实体,因此是否可以通过显式加载而不使用急切加载来执行此操作?

以上是关于在实体内显式加载相关实体的主要内容,如果未能解决你的问题,请参考以下文章

使用急切加载时,实体框架是不是将所有相关实体加载到无限深度

从实体框架中的集合加载相关实体

实体框架 CTP5 重新加载相关实体

实体框架不加载相关对象

实体框架 - 停止按需延迟加载相关实体?

实体框架代码优先多对多不使用 GUID 加载相关实体