简短的答案是 - 您所要求的是期望的,但尚未得到支持,正如当前开始时明确指出的那样(虽然没有足够强调,但没有人喜欢强调限制)多对多 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 填充的事实导航修复。或者更好的是,只需接受公共导航属性并等待该功能的正式实施。