积极/明确地将仅具有导航属性的“子”实体加载到“父”

时间:2018-11-05 21:00:25

标签: entity-framework linq ef-code-first ef-core-2.1

我有一个EF Core 2.1代码优先模型,在两个类之间具有“父子”类型关系:

class Parent
{
    public int Id {get; set;}
    public string Name {get; set;}
}

class Child
{
    public int Id {get; set;}
    public string Description { get; set; }
    public Parent Parent { get; set; }
}

我想加载某个父对象,并确保也加载了它的所有子实体。但是,Child没有导航属性,并且我无法修改这些类,因此无法添加一个。

dbContext.Parents
    .Include(p => p.???)
    .Find(1);

我想我可以做第二个查询,让我反向查找所有内容:

dbContext.Children.Where(c => c.Parent.Id == loadedParent.Id)

但这似乎不是很有效,特别是当您加载多个父母并执行以下可怕操作时:

var parentIds = loadedParents.Select(p => p.Id);
var children = dbContext.Children.Where(c => parentIds.Contains(c.Parent.Id));

只有当您具有“父级对子级”导航属性时,是否可以确保加载实体?

1 个答案:

答案 0 :(得分:1)

  

确保也加载了其所有子实体

因此加载Child实体:

var children = dbContext.Children.Include(c => c.Parent)
    .Where(c => c.Parent.Id == 1).ToList();

如果要获得多个父母,则使用比c.Parent.Id == 1更广泛的选择标准。

如有必要,您可以通过访问Local集合来列出已加载的父项:

va parents = dbContext.Parents.Local;