我在EF
应用程序中使用ASP.Net Core
,并且试图将UserNotification
表与我的User
表关联。这些是表结构:
public class User : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual UserNotifications { get; set; }
}
public class UserNotifications
{
public int Id { get; set; }
[Key, ForeignKey("User")]
public string UserId { get; set; }
public User User { get; set; }
[Key, ForeignKey("Sender")]
public string SenderId { get; set; }
public virtual User Sender { get; set; }
public string Title { get; set; }
public string Message { get; set; }
}
我所做的是创建
ForeignKey
的UserNotifications
,它将存储User
已收据的所有通知。在表
UserNotifications
中,我为FK
和User
创建了两个Sender
。本质上,我想存储已收到通知的Id
的User
和已发送通知(Id
)的User
的Sender
。在
OnModelCreating
中,我还定义了以下逻辑:builder.Entity<UserNotifications>(entity =>
{
entity.HasKey(n => n.Id);
entity.HasOne(u => u.User)
.WithOne(u => u.UserNotifications)
.HasForeignKey<User>(u => u.Id);
entity.HasOne(u => u.Sender)
.WithOne(u => u.UserNotifications)
.HasForeignKey<User>(u => u.Id);
});
当我在
console
中键入以下建筑物时:add-migration InitialMigration -context MyAppContext
我得到:
无法在“ User.UserNotifications”和“ UserNotifications.Sender”之间创建关系,因为“ UserNotifications.User”和“ User.UserNotifications”之间已经存在关系。导航属性只能参与单个关系。
我是
EntityFramework
的新手,所以我不知道该如何解决,有人可以解释我做错了什么吗?在此先感谢您的帮助。
最佳答案
您所描述的模型表示User
和UserNotifications
之间的两个一对多关系(顺便说一句,该实体应命名为UserNotification
)实体。每个EF关系可以在每一侧映射到0或1个唯一的导航属性。
您已经在User
中具有两个Sender
和UserNotifications
参考导航属性(以及相应的FK)。您需要的是User
中两个相应的集合导航属性:
public class User : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<UserNotifications> ReceivedNotifications { get; set; }
public virtual ICollection<UserNotifications> SentNotifications { get; set; }
}
并使用流畅的API映射:
builder.Entity<UserNotifications>(entity =>
{
entity.HasKey(n => n.Id);
entity.HasOne(n => u.User)
.WithMany(u => u.ReceivedNotifications)
.HasForeignKey(n => u.UserId)
.IsRequired()
.OnDelete(DeleteBehavior.Delete);
entity.HasOne(n => n.Sender)
.WithMany(u => u.SentNotifications)
.HasForeignKey(n => n.SenderId)
.IsRequired()
.OnDelete(DeleteBehavior.Restrict);
});
请注意,由于这种模型引入了所谓的多个级联路径,因此您需要关闭级联删除中的至少一个并手动进行处理。