如何首先使用实体​​代码解决多个级联路径

时间:2015-04-28 18:13:45

标签: c# entity-framework-6 ef-fluent-api

Template可以有零个或多个Document,零个或多个MetaIndexDocument可以有零个或多个Index,而MetaIndex也可以有零个或多个Index

enter image description here

这表示潜在的级联问题,因为删除Template会删除其Document(这是正常的);删除Document会删除其Index,这也没问题。但是,当删除Template尝试删除MetaIndex(也会删除Index)时,会出现一个问题(一个循环)。

我理解这个问题。我认为解决这个问题的方法是指定当我删除模板时,它的文档及其文档的索引会被删除,以及与模板关联的元索引。但是,元指示不会级联删除它的相关索引,因此不会出现循环。

在这里搜索potential solution,我试过这个:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<MetaIndex>().HasMany<Index>(m => m.IndicesEnteros).WithRequired().WillCascadeOnDelete(false);
}

但它不起作用:

  

在表上引入FOREIGN KEY约束可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。无法创建约束。查看以前的错误。

1 个答案:

答案 0 :(得分:0)

最后,在reading and re-reading the docs之后,我能够让它工作但是理解属性的顺序。我发布了自己的解决方案,以防它可以帮助其他人。

索引具有必需的MetaIndex(因为它不可为空,如果是,则不会创建级联删除)。接下来是指定它的可导航方式(WithMany,MetaIndex类的集合属性是Indices)。最后,我需要指定外键字段的名称,即(遵循标准)MetaIndexID。然后我可以指定我不需要级联删除。因此,使用级联删除索引的唯一方法是删除文档(我想要的)。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    modelBuilder.Entity<Index>()
        .HasRequired(index => index.MetaIndex)
        .WithMany(metaIndex => metaIndex.Indices)
        .HasForeignKey(index => index.MetaIndexID)
        .WillCascadeOnDelete(false);

    base.OnModelCreating(modelBuilder);
}