2

我有两张有点问题的桌子。

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

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

如您所见,两者都senderId需要receiverId与 users 表中的 userId 相关。

但是当我尝试使用 Code First 时,它只是崩溃了。我得到一个例外:

“在表 'Messages' 上引入 FOREIGN KEY 约束 'FK_dbo.Messages_dbo.Users_ReceiverId' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。”

这就是我在Message 类中建立关系的方式:

    [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; }

有任何想法吗?我现在被困住了。如果我先做数据库,它工作得非常好,但如果我先试试代码就不行。

4

4 回答 4

0

我认为你的答案在这篇文章中

实体框架 4.1 InverseProperty 属性

它说还有另一个名为 InverseAttrivuteProperty 的装饰器,它可以帮助您定义源表中关系的哪一端与命运表中的哪一端匹配。

但是,不要像解释的那样使用它。我不得不把你的装饰器留在外键上。

刚刚测试它并且它有效。很快我会发布一些解释性的东西。

于 2013-12-19T21:06:15.580 回答
0

在Migrations文件夹中生成的.cs文件中,替换为,例如:cascadeDelete: truecascadeDelete: 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);
于 2013-10-30T15:38:07.217 回答
0

默认情况下,EF 代码首先在外键表的删除和更新规则上创建级联选项设置为 true。您可以从 SQL Server 管理工作室检查这一点,方法是右键单击表的外键列,然后展开“插入和更新规范”。 在此处输入图像描述

要快速解决此问题,只需将此代码添加到您已设置 DBSet 信息的 DBContext.cs 或 YourContext.cs 类中。

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {            
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

    }

从项目的包管理器控制台窗口运行 Add-Migration InitialContext 命令和 Update-Database -Verbose 命令。

于 2013-11-06T13:20:11.383 回答
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);

}
于 2014-01-20T09:35:58.313 回答