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<User>'. 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.Creator
和Notification.Updater
或任何其他方式来定义User
和Notification
之间的一对多关系?
我使用 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<Notification>().*
?如果我尝试这样做,那么当我尝试创建迁移时,我会收到 The entity type 'IdentityUserLogin<int>' 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 添加多对多使得一对多无法确定的主要内容,如果未能解决你的问题,请参考以下文章