如何先用实体代码解决多级联路径

How to solve multiple cascade paths with entity code first

一个 Template 可以有零个或多个 Document 和零个或多个 MetaIndex。一个 Document 可以有零个或多个 Index,一个 MetaIndex 也可以有零个或多个 Index:

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

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

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

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

但它不起作用:

Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

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

一个索引有一个必需的 MetaIndex(因为它是不可为 null 的,如果是,则不会创建级联删除)。接下来是指定它是如何导航的(WithMany,MetaIndex class 上的集合 属性 是 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);
}