如何在實體框架核心中導航多對多關係

asp.net-core-mvc entity-framework-core

根據Microsoft Docs https://docs.microsoft.com/en-us/ef/core/modeling/relationships#other-relationship-patterns

尚不支持沒有實體類來表示連接表的多對多關係。

好的,當您需要遷移具有EF5完美處理的多對多關係的應用程序時,這會導致噩夢。

現在我按照鏈接中的描述設置了Keyword,Tag和KeywordTag實體。

如果我有一個關鍵字實體,這是檢索與此類關鍵字相關的所有標籤的正確語法?

在EF5中它是

var kwd = _context.Keywords.Find(my_kwd_id);
var tagList = kwd.Tags;

哪個與EF Core相同? Intellisense允許我寫

kwd.KeywordTags 

但不是

kwd.KeywordTags.Tags

...所以我找不到如何以任何方式訪問標籤...請不要告訴我,我必須明確搜索然後循環KeywordTag實體提取標籤...

熱門答案

由於EF Core與舊版本的EF沒有完全相同,因此您需要編寫不同的代碼。你需要做@Ivan在評論中提出的建議。您還需要急切加載您的集合,因為延遲加載不可用。這意味著您需要明確地進行數據庫查詢。

方法1:而不是直接使用“ Find查詢數據庫並引入相關數據。 (kwd / tagList)將具有您在EF5中看到的相同數據。

var kwd = db.Keywords.Include(k => k.KeywordTags)
    .ThenInclude(kt => kt.Tag)
    .FirstOrDefault(k => k.Id == my_kwd_id);
var tagList = kwd.KeywordTags.Select(kt => kt.Tag).ToList();

或者,您可以顯式使用查找但加載導航。這有點類似於延遲加載,但由於它不可用,因此請求EF加載導航。這將是非常糟糕的性能,因為您將發送1個查詢以從連接表中獲取所有條目,然後對標記表中的每個相關標記進行1次查詢。如果您有興趣知道編寫它的方式,我也可以為此發布代碼。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow