在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
姿态的列表。但是ParentChild
的Child
实体没有自动加载,所以我只有子对象的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));
似乎我误解了ThenInclude
的用法,因为它指的是子实体。有了一个列表,就可以像这样定义要加载的实体:
var parentWithChilds = db.Parents.Include(p => p.ParentChilds)
.ThenInclude(p => p.Child)
.FirstOrDefault(p => p.Id == 1);
Visual Studio在智能感知中显示这些过载有问题,但它在那里并且不会导致错误。