asp.net-core-mvc - 如何在 Entity Framework 核心中导航多对多关系

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

根据微软文档 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/

相关文章:

unit-testing - .net core Url.Action mock,怎么做?

c# - 什么时候可以使用 `IWebHost.Start()` 方法?

c# - LINQ Count 和 Max 一起使用

c# - EF Core SaveChanges 是否根据数据注释进行验证

asp.net - Controller 中的 Linq 查询时间太长

c# - 使用 IConfigureOptions 配置注入(inject)的依赖项

authentication - 如何在 ASP.NET Core 2.0 中配置基于路由的服务身份验证

c# - 实体类型的实例...无法跟踪,因为已跟踪具有相同键的该类型的另一个实例

linq-to-entities - ThenInclude 中的 Entifyframework 核心 2.0 过滤器

c# - 什么会导致 DbSet 中的持久化实体分离?