实体框架代码表之间的前两个关系

时间:2013-10-30 15:33:44

标签: c# sql entity-framework code-first

我有两张表有些问题。

  • 第一个表是关于用户的,并且有 - userId, username, password, etc

  • 第二个是处理消息,因此它有 - messageId, senderId, receiverId, messageContent。

如您所见,senderIdreceiverId都需要与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则不行。

4 个答案:

答案 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管理工作室检查这一点,右键单击表的外键列,然后展开“插入和更新规范”。 enter image description here

要快速解决此问题,只需将此代码添加到您已设置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);

}