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

2024-04-28

我已使用以下代码配置了 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导航属性?


简短的答案是 - 您所要求的是期望的,但尚未得到支持,正如当前开始时明确指出的那样(虽然没有足够强调,但没有人喜欢强调限制)多对多 https://learn.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key#other-relationship-patterns官方 EF Core 文档的部分(重点是我的):

多对多关系两侧都需要集合导航属性.

也在原始跟踪项目的末尾多对多(跳过)导航属性#19003 https://github.com/dotnet/efcore/issues/19003你可以看到基本相同的问题

您好,有没有办法避免为其中一个实体定义属性? 例如

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

团队的回应是

还没有#3864

直指通过影子导航支持单向多对多关系#3864 https://github.com/dotnet/efcore/issues/3864,这是相应的当前未决问题,似乎计划在 6.0 版本中发布。

至于到底为什么,只有团队成员可以回答这个问题,但很可能是因为通常缺乏足够的时间来在有限的时间内适应某些内容来交付特定的版本。用于实现实际功能的全新(且不完全完整)概念(跳过导航),有很多可能的改进,例如支持非多对多跳过导航 #21673 https://github.com/dotnet/efcore/issues/21673、相关的以及许多其他的 - 您可以在此处查看当前列表改进多对多、跳过导航和索引器属性#22960 https://github.com/dotnet/efcore/issues/22960。再加上技术困难,缺乏影子导航属性支持(尽管这并不能阻止其他类型的关系,即使双方都没有导航也可以配置这些关系(这如何有用是另一个故事))等。

最后一点,以防您正在寻找解决方法/克服当前限制的方法。我通常喜欢超越 EF Core 限制,但首先我没有看到值(我个人认为导航属性更像是表示 LINQ 查询中的关系而不是存储的元数据),并且还尝试克服它直接使用内部元数据 API,以及丑陋的代码只会导致不同的运行时异常,这对我来说证明当前的代码确实依赖于“反向”导航,并且在很多地方都受到限制。

所以至少你需要一个私人的ICollection<User> Users属性或字段,从序列化中排除并流畅配置

modelBuilder.Entity<User>().HasMany(e => e.Roles).WithMany("Users");

并接受它将由 EF Core 填充的事实导航修复。或者更好的是,只需接受公共导航属性并等待该功能的正式实施。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • C# 中类似图的实现

    所以我有一个对象 我们称之为 Head 它有一个对象列表 C C1 C2 C3 T T1 T2 和 M M1 M2 并且所有这些都是相互关联的 例如 Head gt C1 C2 C3 T1 T2 M1 M2 T1 gt C1 C2 T2 g
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • C# 中 PKCS11Interop 库的线程安全使用 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 PKCS11Interop 在 HSM 内执行密钥管理操作 我使用的 HSM 是 Thales PCI Express 下面是
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • 选择initializer_list迭代器定义

    Why std initializer list
  • 在 .NET Core 中从 HttpResponseMessage 转换为 IActionResult

    我正在将之前在 NET Framework 中编写的一些代码移植到 NET Core 我有这样的事情 HttpResponseMessage result await client SendAync request if result St
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • C# 中的抽象类和接口类有什么不同?

    C 中的抽象类和接口类有什么不同 An 接口不是类 它只是一个contract定义了public一个类的成员must实施 抽象类只是一个类 您从中可以cannot创建一个实例 通常您会使用它来定义一个基类 该基类定义了一些virtual方法
  • 原子存储抛出错误

    我最近升级到了 C 11 兼容编译器 并且尝试将一些代码从 boost 更新到 c 11 标准 我在使用atomic store转换一些代码时遇到了问题 这是一些简单的测试代码 似乎会引发编译器错误 int main std shared
  • Control.Invoke 是否泵送消息?

    Control Invoke 在被阻塞时是否继续在调用它的线程中泵送消息 系统 Windows 窗体 不会 Invoke 是阻塞的 整个线程将阻塞 直到对 Invoke 的调用返回 还有开始调用 http msdn microsoft co
  • 本地时间的内存需要释放吗?

    void log time t current time 0 tm ptm localtime current stuf 只是想确定 我是否需要在方法结束时释放 tm 指针分配的内存 不 你不应该释放它 该结构是静态分配的 检查文档 htt
  • linq where 子句和 count 导致 null 异常

    除非 p School SchoolName 结果为 null 否则下面的代码将起作用 在这种情况下 它会导致 NullReferenceException if ExistingUsers Where p gt p StudentID i
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • 从具有相同属性的另一个对象创建对象

    我有一个 C 对象 可以说有 20 个属性 它是数据契约的一部分 我还有另一个具有类似属性的业务实体 我想从响应对象中填充该实体 除了将一个对象的每个属性分配给另一个对象的相应属性之外 还有其他方法可以做到这一点吗 是的 看看自动映射器 h
  • 在 C# 命令行应用程序中包含并执行 EXE

    所以我找到了一个很棒的小 EXE 命令行应用程序 我们将其称为 program exe 它输出一些我想用 C 操作的数据 我想知道是否有一种方法可以将program exe 打包 到我的Visual Studio项目文件中 这样我就可以将编
  • 意外的 const 引用行为

    include
  • 展开 std::reference_wrapper 的成本

    Given include
  • C# PasswordDeriveBytes:似乎 Salt 并不重要

    可能我误解了什么 以下代码通过 CryptDeriveKey 使用两种不同的盐生成两个相等的密钥 这是控制台结果 盐1 21 3e 18 a3 9a 8b 5f gt 键 da 89 ea 3d 91 08 20 98 20 e9 dc 4
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和

随机推荐