c# - EF Core 5.0 中的多对多关系是否可以配置为仅保留一个导航属性(在一侧)?

标签 c# .net entity-framework-core many-to-many navigation-properties

我已经使用以下代码配置了我的 DbContext(EF Core 5.0):

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
        .HasMany(p => p.Roles)
        .WithMany(p => p.Users)
        .UsingEntity<Dictionary<string, object>>("UsersToRoles",
            x => x.HasOne<Role>().WithMany().HasForeignKey("UserId"),
            x => x.HasOne<User>().WithMany().HasForeignKey("UserId"),
            x => x.ToTable("UsersToRoles"));

    modelBuilder.Entity<Role>()
        .ToTable("Roles")
        .Property(r => r.Application)
        .IsRequired();

    base.OnModelCreating(modelBuilder);
}
问题是我不喜欢 Role实体持有 Users 的集合.我保留它是因为 EF Core 需要它来配置多对多关系。
有没有办法创建相同的关系,但不必定义 Role.Users导航属性?

最佳答案

简短的回答是 - 您所要求的内容是需要的,但尚未得到支持,正如当前 Many-to-many 开头所明确指出的(虽然强调不够,但没有人喜欢强调局限性)。官方 EF Core 文档的部分(重点是我的):

Many to many relationships require a collection navigation property on both sides.


也在原跟踪项的末尾Many-to-many (skip) navigation properties #19003你可以看到基本相同的问题

Hello, is there a way to avoid defining the property for one of the entities? e.g.

builder.HasMany(p => p.Tags).WithMany(); // notice no parameter in `WithMany`

团队的回应是

Not yet #3864


直指Support unidirectional many-to-many relationships through shadow navigations #3864 ,这是相应的当前 Unresolved 问题,似乎计划发布 6.0。
至于具体原因,只有团队成员可以回答这个问题,但很可能是因为通常没有足够的时间在有限的时间内完成特定版本的交付。用于实现实际功能的全新(且不完整)概念(跳过导航),有许多可能的改进,如 Support non-many-to-many skip navigations #21673 ,有问题的和许多其他人 - 您可以在此处查看当前列表 Improve many-to-many, skip navigations, and indexer properties #22960 .加上技术困难,缺乏阴影导航属性支持(尽管这并不能阻止其他类型的关系,即使在任何一方都没有导航(这将如何有用是另一回事))等。
最后要注意的是,如果您正在寻找解决方法/克服当前限制的方法。我通常喜欢超越 EF Core 的限制,但在这里首先我没有看到值(我个人认为导航属性更像是表示 LINQ 查询中的关系而不是存储的元数据),并且还试图克服它直接使用内部元数据 API 以及丑陋的代码只会导致不同的运行时异常,这对我来说证明当前代码确实依赖于“反向”导航,并且在很多地方都受到限制。
所以至少你需要一个私有(private) ICollection<User> Users属性或字段,从序列化中排除并流畅配置
modelBuilder.Entity<User>().HasMany(e => e.Roles).WithMany("Users");
并接受它将从 EF Core 导航修复中填充的事实。或者更好,只需使用公共(public)导航属性并等待该功能的正式实现。

关于c# - EF Core 5.0 中的多对多关系是否可以配置为仅保留一个导航属性(在一侧)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66790470/

相关文章:

c# - 我应该将什么 'length' 参数传递给 SqlDataReader.GetBytes()

c# - 创建 WCF 服务时要避免哪些 DataContract 对象类型?

c# - 从 .NET 3 迁移到 .NET 5 时,Azure Function 中出现错误 "Did not find functions with language [dotnet-isolated]"

c# - 可自定义的文件夹浏览器对话框 c#

.net - 移动类时保持 .NET 序列化数据兼容性

c# - 直接将字节数组发送到打印机

c# - 按 Enter 键单击一个 LinkLabel

entity-framework - 同一数据库中的 Entity Framework 核心多个 DbContext 迁移

c# - 使用 Entity Framework 手动输入 key

ASP.NET 5、EF 7 和 SQLite - SQLite 错误 1 ​​: 'no such table: Blog'