在ASP中包含通用列表属性的实体.. NET实体框架核心

本文关键字:实体 NET 框架 核心 属性 列表 ASP 包含通 | 更新日期: 2023-09-27 18:15:36

我使用关系表在父母和孩子之间建立了多对多关系,因为这些关系在EF Core中还不自动支持:

class Parent{
    [Key]
    public int Id{get;set;}
    public List<ParentChild> ParentChilds{get;set;}
}
class Child{
    [Key]
    public int Id{get;set;}
    public List<ParentChild> ParentChilds{get;set;}
}
class ParentChild{
    public int ParentId{get;set;}
    public Parent Parent{get;set;}
    public int ChildId{get;set;}
    public Child Child{get;set;}
}

为了编辑父节点,我需要得到他所有的子节点。似乎是Include()的工作

var db = new MyDbContext();
var parentWithChilds = db.Parents.Include(p => p.ParentChilds)
    .FirstOrDefault(p => p.Id == 1);

这给了我ParentChild姿态的列表。但是ParentChildChild实体没有自动加载,所以我只有子对象的Id,而不是我需要的子对象本身。我发现ThenInclude似乎是为这种情况而设计的,从这样的例子中,我做了以下工作:

var parentWithChilds = db.Parents.Include(p => p.ParentChilds)
    .ThenInclude(p => p.Select(x => x.Child))
    .FirstOrDefault(p => p.Id == 1);

但是会抛出一个异常:

属性表达式'p => {from ParentChild x in p select [x]。Child => FirstOrDefault()}'无效。表达式应该表示一个属性访问:'t => t.MyProperty'。

那么如何做到这一点呢?我想避免不必要的查询,如手动获取实体的方式:

user.ParentChilds.ForEach(pc => pc.Child = db.Childs.FirstOrDefault(x => x.Id == pc.ChildId));

在ASP中包含通用列表属性的实体.. NET实体框架核心

似乎我误解了ThenInclude的用法,因为它指的是子实体。有了一个列表,就可以像这样定义要加载的实体:

var parentWithChilds = db.Parents.Include(p => p.ParentChilds)
    .ThenInclude(p => p.Child)
    .FirstOrDefault(p => p.Id == 1);

Visual Studio在智能感知中显示这些过载有问题,但它在那里并且不会导致错误。