asp.net - Entity Framework Core 中的两个外键

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

我在使用 Entity Framework Core 创建数据库时使用代码优先方法。我想创建两个指向同一个表的外键。
我的示例显示了 User 表,其中包含 userID 和 Message 表,其中包含接收者 ID 和发送者 ID(这意味着两个值都必须指向同一个表)。

用户代码:

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 方法。它表明它不存在。

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

谢谢!

最佳答案

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

关于asp.net - Entity Framework Core 中的两个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49223793/

相关文章:

ASP.NET 应用程序未记录到 Windows 事件日志

javascript - 数据保存后、重定向到同一页面(或刷新)之前显示“确定”对话框

asp.net - 如何更改身份验证模式(从 Windows 到 Azure AD)

c# - 如何跟踪数据库的更改?

c# - 有没有办法映射到 Entity Framework 中的不可变实体?

asp.net - 当窗口变小时,如何防止面板被强制置于另外两个面板下方?

c# - ef-core 加载嵌套 tph 继承成员的集合属性

c# - 如何使用 ForNpgsqlUseXminAsConcurrencyToken 创建的 EF Core 并发 token

c# - 在 ASP.NET Core MVC 中同时验证两个属性

c# - ASP.NET 核心 Web API : Required parameter with conditions