实体框架核心:从子级访问父级

时间:2019-05-29 19:43:10

标签: c# entity-framework-core relationship ef-core-2.2

可能是一个愚蠢的问题,但我在这里有些困惑。

我有一个包含孩子列表的父实体。

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

    public List<Child> Children { get; set; }
}

public class Child
{
    public int Id { get; set; }
}

EFcore将在表ParentId中创建一个Child作为外键。

现在,假设我要检索具有特定父级的所有子级,该怎么办? ParentId对象中没有Child

因此,我不能做类似的事情:

var result = model.Child.Where(child => child.ParentId == 3);

我可以将ParentId属性添加到实体中的子级,但是我真的不希望手动分配此属性。如果我仅通过指定getter将其设置为只读,则迁移将不再起作用。

3 个答案:

答案 0 :(得分:3)

EF Core允许您使用shadow property方法访问LINQ to Entities查询中的关联EF.Property

  

寻址实体实例上的给定属性。当您要在LINQ查询中引用阴影状态属性时,此功能很有用。当前,此方法只能在LINQ查询中使用,在其他情况下不能用于访问分配给属性的值。

您只需要知道名称和类型-在您的情况下,它们是“ ParentId”和int?(可选):

var result = model.Child.Where(child => EF.Property<int?>(child, "ParentId") == 3);

答案 1 :(得分:2)

我建议您同时在@ScotG答案中提供相应类别中的引用(儿童父母和父母子女)。

但是,由于您不想要这样做,因此在EF中使用延迟加载,您可以执行类似model.Parents.Find(3).Children的操作,因为从Parent类中,您可以得到其子级的引用。

答案 2 :(得分:0)

public class Child
{
    public int Id { get; set; }

    // add these navigation properties to access the Parent
    public int ParentId {get; set; }
    public Parent Parent {get; set; }
}

https://www.learnentityframeworkcore.com/conventions/one-to-many-relationship