【问题标题】:How to navigate many-to-many relationships in entity framework core如何在实体框架核心中导航多对多关系
【发布时间】:2017-04-29 15:33:58
【问题描述】:

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

没有实体类来表示的多对多关系 尚不支持连接表。

好的,当您需要迁移具有多个由 EF5 完美处理的多对多关系的应用程序时,这会导致一场噩梦。

现在我已经按照链接中的说明设置了关键字、标签和关键字标签实体。

如果我有一个关键字实体,检索与该关键字关联的所有标签的正确语法是什么?

在 EF5 中是

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

哪个与 EF Core 等效? Intellisense 允许我写作

kwd.KeywordTags 

但不是

kwd.KeywordTags.Tags

...所以我找不到如何以任何方式访问标签... 请不要告诉我我必须显式搜索然后循环 KeywordTag 实体以提取标签...

【问题讨论】:

  • kwd.KeywordTags.Select(x => x.Tag)?
  • 非常感谢!无论如何,很难接受如果你想更进一步(如“采用新技术”),那么你必须退后(如“新技术被打破,直到它们变老,所以它们可以被其他再次被打破的新技术”等等......)
  • 如果有人还在寻找如何实现相同的目标,this 回答会根据我的需要指导我。

标签: asp.net-core-mvc entity-framework-core


【解决方案1】:

由于 EF Core 与旧版本的 EF 不完全相同,因此您需要编写一些不同的代码。您需要执行 @Ivan 在 cmets 中建议的操作。您还需要预先加载您的集合,因为延迟加载不可用。这意味着您需要明确地进行数据库查询。

方法一:不使用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();

或者,您可以使用 find 但显式加载导航。这有点类似于延迟加载,但由于它不可用,因此您要求 EF 加载导航。这将具有非常糟糕的性能,因为您将发送 1 个查询以从连接表中获取所有条目,然后为标签表中的每个相关标签发送 1 个查询。如果你有兴趣知道它的编写方式,我也可以发布代码。

【讨论】:

  • 非常感谢您的解释。我从未见过这种语法,总是使用 Where 子句而不是指定选择条件作为 FirstOrDefault 的参数。有什么区别?
  • 两者相同。许多给出单一结果的 Linq 方法都将 lambda 表达式作为参数,这相当于编写一个 where 子句后跟无参数运算符。在上面的代码中,你可以写 where 后跟 FirstOrDefault 不带参数。
【解决方案2】:

标签是IEnumerable<Tag>。您可以使用 foreach 循环遍历标签。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 2018-04-24
    • 2020-01-26
    相关资源
    最近更新 更多