EF Core 5.0 添加多对多使得一对多无法确定

Posted

技术标签:

【中文标题】EF Core 5.0 添加多对多使得一对多无法确定【英文标题】:EF Core 5.0 Adding many-to-many makes one-to-many unable to determine 【发布时间】:2021-04-23 03:01:15 【问题描述】:

我想利用 ef core 5.0 中新的多对多功能。 https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key

我现有的课程是

public class User : IdentityUser<int>


public class Notification

    public int ID  get; set; 
    public string Title  get; set; 
    public string Message  get; set; 
    public DateTime Created  get; set; 
    public DateTime Updated  get; set; 
    public User Creator  get; set; 
    public User Updater  get; set; 
    public Notification()
    
    

我想在它们之间添加一个多对多的关系,以便类是

public class User : IdentityUser<int>

    public ICollection<Notification> Notifications  get; set; 

public class Notification

    //[...]
    public ICollection<User> Recipients  get; set; 

现在dotnet ef migrations add NotificationRecipients 的结果是Unable to determine the relationship represented by navigation 'Notification.Recipients' of type 'ICollection&lt;User&gt;'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.

经过一番研究,我找到了 [InverseProperty()] 注释,因此我将其添加到 Notification.cs

public class Notification

    //[...]
    [InverseProperty("Notifications")]
    public ICollection<User> Recipients  get; set; 

多对多现在似乎已解决,但 dotnet ef migrations add NotificationRecipients 导致 Unable to determine the relationship represented by navigation 'Notification.Creator' of type 'User'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.

是否有任何注释可以添加到Notification.CreatorNotification.Updater 或任何其他方式来定义UserNotification 之间的一对多关系?

我使用 MSSQL 作为数据库。

【问题讨论】:

我无法理解您在用户和通知之间建立了多对多关系,同时您还需要在用户和通知之间建立一对多关系!!!这是不可行的,您可以添加 CreatorId 和 UpdaterId 并将 [NotMapped] 添加到 Creator 属性和 Updater 我很确定它是可能的。这些关系有不同的用途,之前的迁移中已经添加了 Creator 和 Updater。 CreatorId 和 UpdaterId 已经是 DBColumns。 我的意思是这种方式不可行,尝试添加creatorId并使用fluent api使creator NotMapped或手动配置作为Ivan的答案 【参考方案1】:

两个实体之间的多重关系通常不能自动确定,需要配置。 EF Core 中的很多东西(尤其是关系相关的)只能使用 fluent API 进行配置。

因此,与其寻找不存在或不直观的数据注释,不如简单地配置所需的关系(至少 - 导航属性和基数):

modelBuilder.Entity<Notification>(builder =>

    builder.HasOne(e => e.Creator).WithMany();
    builder.HasOne(e => e.Updater).WithMany();
    builder.HasMany(e => e.Recipients).WithMany(e => e.Notifications);
);

【讨论】:

可能你提到了builder.Entity&lt;Notification&gt;().*?如果我尝试这样做,那么当我尝试创建迁移时,我会收到 The entity type 'IdentityUserLogin&lt;int&gt;' requires a primary key to be defined. If you intended to use a keyless entity type, call 'HasNoKey' in 'OnModelCreating'. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943. 如果你继承了IdentityDbCiontext,请确保在OnModelCreating覆盖的开头调用base.OnModelCreating(modelBuilder);。如果这没有帮助,那么您还有另一个单独的问题 - EF Core 报告找到的第一个问题,当它修复时 - 下一个等。此代码应该已经解决了您的问题中的关系问题。对于其他问题 - 新问题。

以上是关于EF Core 5.0 添加多对多使得一对多无法确定的主要内容,如果未能解决你的问题,请参考以下文章

IOS/Core-Data:添加多对多关系

EF Core 一对一 一对多 多对多 关系定义

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

添加多对多关系时检测重复插入

在放大graphql中添加多对多连接

在Django的save方法中动态添加多对多关系