实体框架核心中的两个外键 [英] Two Foreign Keys in Entity Framework Core

查看:101
本文介绍了实体框架核心中的两个外键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在使用Entity Framework Core创建数据库时,我正在使用代码优先方法.我想创建两个指向同一张表的外键. 我的示例显示了将包含userID的User表和将包含Receiver ID和Sender ID的Message表(这意味着两个值必须指向同一表).

I am using Code First approach while creating Database using Entity Framework Core. I would like to create two foreign keys pointing the same table. My example shows User table which will hold userID and Message table which will hold both Receiver ID and Sender ID (what means both values have to point the same table).

用户代码:

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

I am using ASP.NET Core 2 and I am a newbie. I was trying to use this solution, but unfortunately, I couldn't manage to override OnModelCreating method. It shows that it doesn't exist.

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

PS. don't mind password field, it is only for testing purpose.

谢谢!

推荐答案

我设法使用Fluent API使其正常工作.

I managed to make it works using Fluent API.

我的DbContext中的代码:

Code in my 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);                
}

此外,我发现了未设置用户删除行为的问题. 有两种解决方法.

What is more, I've discovered a problem with not set User deletion behaviour. There are two options to solve it.

如果删除了用户,则首先保留消息:

First is keeping Messages if User was deleted:

.OnDelete(DeleteBehavior.Restrict);

或秒将删除邮件

.OnDelete(DeleteBehavior.Cascade);

这篇关于实体框架核心中的两个外键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆