我使用关系表在父母和孩子之间存在多对多的关系,因为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
点的清单。但是Child
的{{1}}实体并没有自动加载,所以我只有孩子的Id,而不是我需要的Child对象本身。我发现ParentChild
似乎是针对此类情况而设计的,例如this我做了以下内容:
ThenInclude
但它引发了一个例外:
属性表达式&#39; p =&gt; {来自ParentChild x in p select [x] .Child =&gt; FirstOrDefault()}&#39;无效。表达式应代表属性访问权限:&#39; t =&gt; t.MyProperty&#39;
那怎么办呢?我想避免不必要的查询,例如手动获取实体:
var parentWithChilds = db.Parents.Include(p => p.ParentChilds)
.ThenInclude(p => p.Select(x => x.Child))
.FirstOrDefault(p => p.Id == 1);
答案 0 :(得分:2)
似乎我误解了ThenInclude
的用法,因为它引用了子实体。有一个列表可以定义要加载的实体,如下所示:
var parentWithChilds = db.Parents.Include(p => p.ParentChilds)
.ThenInclude(p => p.Child)
.FirstOrDefault(p => p.Id == 1);
Visual Studio在智能感知中显示出这些重载的问题,但它存在并且不会导致错误。