渴望加载实体框架核心

时间:2017-02-13 14:45:44

标签: c# entity-framework-core

我正在寻找创建条目后加载导航属性的最优雅/最佳方式。

情况是这样的: *我在表格中创建一行,并按ID链接其他2个表格。我回来的对象只包含id' s,而不是实际的链接对象。 *通过急切加载我想加载这些对象

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次组合调用。或者我错过了另一种链接这些引用的方法?

1 个答案:

答案 0 :(得分:2)

对于此特定方案,您可以使用简单的匿名类型投影,并依赖Loading Related Data中所述的导航属性修复:

  

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

所以以下方法可以胜任:

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

理论上应该更好(只应加载相关数据)。但是,由于当前(v1.1.0)EF Core错误,它还会包含所有根对象字段,从而使其等同于Include s的变体:

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

我个人会使用第一种方法,因为希望在未来的某些EF Core版本中修复错误,而第二种方法行为是"设计"。