在ASP.NET EntityFramework Core

时间:2016-10-30 12:08:41

标签: c# entity-framework asp.net-core entity-framework-core generic-list

我使用关系表在父母和孩子之间存在多对多的关系,因为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);

1 个答案:

答案 0 :(得分:2)

似乎我误解了ThenInclude的用法,因为它引用了子实体。有一个列表可以定义要加载的实体,如下所示:

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

Visual Studio在智能感知中显示出这些重载的问题,但它存在并且不会导致错误。