我在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; }
}


我所做的是创建ForeignKeyUserNotifications,它将存储User已收据的所有通知。

在表UserNotifications中,我为FKUser创建了两个Sender。本质上,我想存储已收到通知的IdUser和已发送通知(Id)的UserSender

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的新手,所以我不知道该如何解决,有人可以解释我做错了什么吗?

在此先感谢您的帮助。

最佳答案

您所描述的模型表示UserUserNotifications之间的两个一对多关系(顺便说一句,该实体应命名为UserNotification)实体。每个EF关系可以在每一侧映射到0或1个唯一的导航属性。

您已经在User中具有两个SenderUserNotifications参考导航属性(以及相应的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);
 });


请注意,由于这种模型引入了所谓的多个级联路径,因此您需要关闭级联删除中的至少一个并手动进行处理。

09-28 05:11