2017-02-13 163 views
0

我正在寻找最优雅/最好的方式来创建条目后加载导航属性。急切加载实体框架核心

情况是这样的: *我在我的表格中创建一行,并通过ID链接2个其他表格。我得到的对象只包含id的,而不是实际的链接对象。 *通过预先加载我想加载这些对象

context.Entry(b).Reference(e => e.Table1).Reference(e => e.Table2).Load(); 

似乎不工作,我不能链引用,所以我既可以查询完整的对象:

context.Objects.Where(o => o.ID == id).Include(o => o.Table1).Include(o => Table2).FirstOrDefault(); 

或做这样的:

context.Entry(b).Reference(e => e.Table1).Load(); 
context.Entry(b).Reference(e => e.Table2).Load(); 

但是这创造了(我怀疑)2个调用数据库,而不是1级相结合的呼叫。或者我错过了另一种链接这些引用的方式?

回答

2

对于您可以使用简单的匿名类型的投影,并依靠在Loading Related Data描述的导航属性FIX-了这个特定的场景:

提示
实体框架的核心将自动修复式导航性能到先前加载到上下文实例中的任何其他实体。因此,即使您未明确包含导航属性的数据,如果先前加载了一些或所有相关实体,该属性仍可能会填充。

所以下面将做的工作:

context.Objects 
    .Where(o => o.ID == id) 
    .Select(o => new { o.Table1, o.Table2 }) 
    .Load(); 

,并在理论上应该是更好的(应该仅加载相关数据)。然而,由于电流(V1.1.0)EF核心的错误它也将包括所有的根对象的字段,从而使其等效变体与Include S:

context.Objects 
    .Where(o => o.ID == id) 
    .Include(o => o.Table1) 
    .Include(o => o.Table2) 
    .Load(); 

我个人使用,因为第一种方法该错误有望在未来的EF Core版本中得到修复,而第二种方法行为是“按设计”。