在ASP.NET EntityFramework Core中包含泛型列表屬性的實體

asp.net-core c# entity-framework 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 istances列表。但是ParentChildChild實體沒有自動加載,所以我只有孩子的Id,而不是我需要的Child對象本身。我發現ThenInclude這似乎是專為這種情況下,並從類似的例子這個我做了以下內容:

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

但它引發了一個例外:

屬性表達式'p => {來自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在智能感知中顯示了那些重載的問題,但它存在並且不會導致錯誤。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因