我有两张表有些问题。
第一个表是关于用户的,并且有 - userId, username, password, etc
。
第二个是处理消息,因此它有 - messageId, senderId, receiverId,
messageContent。
如您所见,senderId
和receiverId
都需要与users表中的userId相关。
但是当我尝试使用Code First时,它只会崩溃。 我得到例外:
"介绍FOREIGN KEY约束' FK_dbo.Messages_dbo.Users_ReceiverId'在桌面上'消息'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。"
这就是我在消息类中建立关系的方式:
[ForeignKey("Sender")]
public int SenderId { get; set; }
public virtual User Sender { get; set; }
[ForeignKey("Receiver")]
public int ReceiverId { get; set; }
public virtual User Receiver { get; set; }
有什么想法吗?我现在卡住了。如果我首先使用数据库,它的工作完全正常,但如果我尝试Code First则不行。
答案 0 :(得分:0)
在迁移文件夹中生成的 .cs 文件中,将cascadeDelete: true
替换为cascadeDelete: false
,例如:
AddForeignKey("dbo.Messages", "ReceiverId", "dbo.Users", "Id",
cascadeDelete: true);
AddForeignKey("dbo.Messages", "SenderId", "dbo.Users", "Id",
cascadeDelete: true);
变为:
AddForeignKey("dbo.Messages", "ReceiverId", "dbo.Users", "Id",
cascadeDelete: false);
AddForeignKey("dbo.Messages", "SenderId", "dbo.Users", "Id",
cascadeDelete: false);
答案 1 :(得分:0)
默认情况下,EF代码首先在“删除和更新外键规则”表上创建Cascade选项设置为true。您可以从SQL Server管理工作室检查这一点,右键单击表的外键列,然后展开“插入和更新规范”。
要快速解决此问题,只需将此代码添加到您已设置DBSet信息的DBContext.cs或YourContext.cs类中。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}
从项目的程序包管理器控制台窗口运行Add-Migration InitialContext命令和Update-Database -Verbose命令。
答案 2 :(得分:0)
我认为你的回答是在这篇文章中
Entity Framework 4.1 InverseProperty Attribute
它说还有另一个名为InverseAttrivuteProperty的装饰器,它可以帮助你定义原始表中关系的哪一端与命运表上的哪一端匹配。
但是,不要使用它,因为它被解释。我不得不把你的装饰师留在外键上。
刚试过它并且有效。很快我会发一些解释。
答案 3 :(得分:0)
只需手动配置您的实体关系,以避免混淆EF。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Message>()
.HasOptional(x => x.Sender)
.WithMany(x => x.SenderMessages);
modelBuilder.Entity<Message>()
.HasOptional(x => x.Reciever)
.WithMany(x => x.RecieverMessages);
}