0

ATemplate可以有零个或多个Document和零个或多个MetaIndex。ADocument可以有零个或多个Index,aMetaIndex也可以有零个或多个Index

在此处输入图像描述

这代表了一个潜在的级联问题,因为删除 aTemplate将删除它Document(没关系);删除 aDocument将删除其Index,这也可以。但是当删除一个Template尝试删除的MetaIndex(也会删除Index)时会出现一个问题(一个循环)。

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

在这里搜索潜在的解决方案,我试过这个:

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 约束。无法创建约束。请参阅以前的错误。

4

1 回答 1

0

最后,在阅读和重新阅读文档之后,我能够让它工作,但了解属性的顺序。我正在发布我自己的解决方案,以防它可以帮助其他人。

索引具有必需的 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);
}
于 2015-04-28T20:17:28.837 回答