【问题标题】:Two Foreign Keys in Entity Framework CoreEntity Framework Core 中的两个外键
【发布时间】:2018-08-19 19:09:12
【问题描述】:

我在使用 Entity Framework Core 创建数据库时使用 Code First 方法。我想创建两个指向同一个表的外键。 我的示例显示了将保存 userID 的 User 表和保存 Receiver ID 和 Sender ID 的 Message 表(这意味着两个值必须指向同一个表)。

用户代码:

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,我是新手。 我试图使用this 解决方案,但不幸的是,我无法覆盖 OnModelCreating 方法。它表明它不存在。

PS。不要介意密码字段,它仅用于测试目的。

谢谢!

【问题讨论】:

  • 当然有OnModelCreating。只是 EF Core 方法签名不同。所以流畅的API。您需要的一切都在文档的Relationships 部分进行了说明。

标签: asp.net entity-framework asp.net-core entity-framework-core asp.net-core-2.0


【解决方案1】:

我设法使用 Fluent 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);

【讨论】:

  • 或第二个将删除消息 这不仅仅是“删除消息”。它实际上是在删除父对象时删除相关数据。由于这个原因,级联删除可能非常危险 - 您可能不知道其他对象已被删除。应用此设置时要小心。
猜你喜欢
  • 2023-04-05
  • 2016-12-16
  • 2022-09-22
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2013-03-06
  • 2018-09-28
  • 1970-01-01
相关资源
最近更新 更多