我在使用 Entity Framework Core 创建数据库时使用代码优先方法。我想创建两个指向同一个表的外键。
我的示例显示用户表将保存用户 ID,消息表将保存接收者 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 https://stackoverflow.com/questions/5559043/entity-framework-code-first-two-foreign-keys-from-same-table解决方案,但不幸的是,我无法覆盖 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)