entity-framework-4.1 - Entity Framework 代码优先 : FOREIGN KEY constraint may cause cycles or multiple cascade paths

标签 entity-framework-4.1 ef-code-first

Entity Framework Code First 可以为以下 POCO 生成数据库。

public class Item {
    public int Id { get; set; }
    public string Name { get; set; }
}

public class ItemPair {
    public int Id { get; set; }

    public virtual Item FirstItem { get; set; }
    public virtual Item SecondItem { get; set; }
}

我想通过 ID 字段而不是整个“项目”类来建立与第一个和第二个项目的关系。所以:
public class ItemPair {
    public int Id { get; set; }

    public virtual Item FirstItem { get; set; }
    public int FirstItem_Id { get; set; }

    public virtual Item SecondItem { get; set; }
    public int SecondItem_Id { get; set; }
}

也有效。 编辑 : 这实际上没有用。只需生成额外的 FirstItem_Id1 和 SecontItem_Id2 列。

但只需将外键属性更改为 FirstItemId、SecondItemId(不带下划线),如下所示:
public class ItemPair {
    public int Id { get; set; }

    public virtual Item FirstItem { get; set; }
    public int FirstItemId { get; set; }

    public virtual Item SecondItem { get; set; }
    public int SecondItemId { get; set; }
}

导致以下异常。
{"Introducing FOREIGN KEY constraint 'ItemPair_SecondItem' on table 'ItemPair' may cause
cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION,
or modify other FOREIGN KEY constraints.\r\nCould not create constraint. 
See previous errors."}

为什么?我能做些什么来避免这个异常。

最佳答案

我决定只删除级联删除约定。

 protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

    }

原因是:
  • 我更喜欢将记录标记为已删除或停用以进行审核。
  • 最多我只删除联结/映射表。
  • 使用 ORM 在我需要的极少数情况下循环和删除子记录相对简单。

  • 感谢 Ladislav Mrnka 为我指明了正确的方向。

    关于entity-framework-4.1 - Entity Framework 代码优先 : FOREIGN KEY constraint may cause cycles or multiple cascade paths,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8216711/

    相关文章:

    entity-framework - Entity Framework 跟踪的开销是多少?

    entity-framework - Entity Framework 在多对多更新场景中附加麻烦

    c# - 从源代码管理发布时如何启用 Windows Azure 的 Code First Entity Framework 迁移?

    c# - 作为外键的字符串 - 无法将 lambda 表达式转换为类型 'string',因为它不是委托(delegate)类型

    image - 使用 ASP.NET MVC 3 和 Entity Framework 4.1 Code First 在 SQL CE 4.0 中存储图像时出错

    c# - LINQ 表达式中的函数应用

    c#-4.0 - Entity Framework 和强制内连接

    c# - Entity Framework 4.1 - 使用过滤器覆盖实体 (DBSet)

    c# - 使用 GraphDiff 更新多对多关系会导致错误

    linq - 如何计算嵌套集合/代码优先 Entity Framework 中的项目