实体框架渴望在许多嵌套实体中加载

时间:2019-11-28 04:20:52

标签: entity-framework collections nested eager-loading

我有六个班级,如下所示-

        Class A{
           int ValA;
           ICollection<B> AllBs;
        }
        Class B{
           int ValB;
           ICollection<C> AllCs;
        }
        Class C{
           int ValC;
           ICollection<D> AllDs;
        }

        Class D{
           int ValD;
           ICollection<E> AllEs;
        }
        Class E{
           int ValE;
           ICollection<F> AllFs;
        }
        Class F{
           int ValF;
        }

我必须急于加载具有特定ID的A实体,并且我希望结果必须急于加载所有嵌套集合。

我编写了以下代码来实现相同的功能-

        var entity = _context.A.Where(a => a.Id == 1)
                        .Include(a => a.AllBs
                                        .Select(b => b.AllCs
                                        .Select(c => c.AllDs
                                        .Select(d => d.AllEs
                                        .Select(e => e.AllFs)))))
                        .FirstOrDefault();

我是否正确编写了include语句?所有嵌套集合均未正确加载。它们将被加载到AllB,AllC和其他集合中。

请帮助。

1 个答案:

答案 0 :(得分:0)

如果这是EF Core,您将要使用

_context.A
  .Include(a => a.AllBs)
  .ThenInclude(b => b.AllCs)
  .ThenInclude(c => c.AllDs)
  .ThenInclude(d => d.AllEs)
  .ThenInclude(e => e.AllFs)
  .Single(a => a.Id == 1)

Intellisense可能会给您带来一些悲伤的苦恼,但确实可以解决问题。

对于EF6,您的陈述应该起作用,因此,如果没有,我将专门研究您的映射,以确保您的FK能够正确解析。我还将删除.Where().FirstOrDefault(),而在末尾使用.Single()。在查询生成中这无关紧要,但是Include语句最好放在任何过滤之前。使用SQL事件探查器捕获正在发送到服务器的SQL,以查看正在请求什么表以及它们如何联接。这可能会突出显示一些FK分辨率错误。

相关问题