根据微软文档 https://learn.microsoft.com/en-us/ef/core/modeling/relationships#other-relationship-patterns
Many-to-many relationships without an entity class to represent the join table are not yet supported.
好吧,当您需要迁移具有多个由 EF5 完美处理的多对多关系的应用程序时,这会导致一场噩梦。
现在我已经按照链接中的说明设置了关键字、标签和关键字标签实体。
如果我有一个关键字实体,检索与该关键字关联的所有标签的正确语法是什么?
在 EF5 中是
var kwd = _context.Keywords.Find(my_kwd_id);
var tagList = kwd.Tags;
哪个与 EF Core 等效? 智能感知让我可以写作
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 个查询来获取标签表中的每个相关标签。如果您有兴趣了解如何编写它,我也可以发布代码。
关于asp.net-core-mvc - 如何在 Entity Framework 核心中导航多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43697468/