Entity Framework Core中的两个外键

4

我在使用Entity Framework Core创建数据库时采用了Code First方法。我想要创建两个指向同一张表的外键。

下面是我的示例:用户(User)表将包含userID,信息(Message)表将同时包含接收者ID和发送者ID(这意味着两个值都需要指向同一张表)。

User表的代码:

public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    [MaxLength(50)]
    public string UserName { get; set; }
    [Required]
    [MaxLength(50)]
    public string Password { get; set; }

    public virtual ICollection<Message> MessagesSent { get; set; }
    public virtual ICollection<Message> MessagesReceived { get; set; }
}

消息:

public class Message
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id { get; set; }

    public User Sender { get; set; }
    public User Receiver { get; set; }
    public int senderId { get; set; }
    public int receiverId { get; set; }

    [MaxLength(500)]
    public string message { get; set; }

}

我正在使用ASP.NET Core 2,是个新手。我试着使用这个解决方案,但是不幸的是,我无法重写OnModelCreating方法,因为它显示该方法不存在。
PS. 不要在意密码字段,它只是用于测试目的。
谢谢!

1
当然有 OnModelCreating 方法。只是 EF Core 的方法签名不同,所以流畅的 API 也不同。你需要的一切都在文档的关系部分中有详细解释。 - Ivan Stoev
1个回答

6

我使用流畅API成功使其工作。

我的DbContext中的代码:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Message>()
        .HasOne(p => p.Receiver)
        .WithMany(t => t.MessagesReceived)
        .HasForeignKey(m => m.ReceiverId)
        .OnDelete(DeleteBehavior.Restrict);

    modelBuilder.Entity<Message>()
        .HasOne(p => p.Sender)
        .WithMany(t => t.MessagesSent)
        .HasForeignKey(m => m.SenderId)
        .OnDelete(DeleteBehavior.Restrict);                
}

此外,我发现未设置用户删除行为存在问题。有两种解决方法。 第一种是如果用户被删除,则保留消息:
.OnDelete(DeleteBehavior.Restrict);

或者第二个选项将删除信息:
.OnDelete(DeleteBehavior.Cascade);

1
第二个选项将删除消息。这不仅仅是“删除消息”。实际上,当父对象被删除时,它会删除相关数据。由于级联删除可能非常危险 - 您可能没有意识到其他对象已被删除。在应用此设置时要小心。 - Yuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接