C# 如何先用实体代码求解多个级联路径

C# 如何先用实体代码求解多个级联路径,c#,entity-framework-6,ef-fluent-api,C#,Entity Framework 6,Ef Fluent Api,模板可以有零个或多个文档和零个或多个元索引。文档可以有零个或多个索引,而元索引也可以有零个或多个索引: 这是一个潜在的级联问题,因为删除模板将删除其文档(这是正常的);删除文档将删除其索引,这也可以。但是,当删除模板时,尝试删除元索引(这也将删除索引),会出现问题(循环) 我理解这个问题。我认为解决这个问题的一种方法是指定当我删除模板时,它的文档和文档的索引被删除,以及与模板关联的元索引。但是元索引不会级联删除它的关联索引,因此不会出现循环 在此处搜索a,我尝试了以下方法: protected

模板可以有零个或多个
文档
和零个或多个
元索引
文档
可以有零个或多个
索引
,而
元索引
也可以有零个或多个
索引

这是一个潜在的级联问题,因为删除
模板
将删除其
文档
(这是正常的);删除
文档
将删除其
索引
,这也可以。但是,当删除
模板
时,尝试删除
元索引
(这也将删除
索引
),会出现问题(循环)

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

在此处搜索a,我尝试了以下方法:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<MetaIndex>().HasMany<Index>(m => m.IndicesEnteros).WithRequired().WillCascadeOnDelete(false);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().HasMany(m=>m.indicenteros).WithRequired().WillCascadeOnDelete(false);
}
但它不起作用:

在表上引入外键约束可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。无法创建约束。请参阅前面的错误

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

索引具有必需的元索引(因为它不可为空,如果为空,则不会创建级联删除)。下一步是指定它的导航方式(使用many,MetaIndex类上的集合属性是Indexs)。最后,我需要指定外键字段的名称,它是(遵循标准)MetaIndexID。然后我可以指定我不需要级联删除。因此,通过级联删除索引的唯一方法是通过文档删除(我希望这样)

模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasRequired(index=>index.MetaIndex)
.WithMany(metaIndex=>metaIndex.index)
.HasForeignKey(index=>index.MetaIndexID)
.WillCascadeOnDelete(假);
基于模型创建(modelBuilder);
}

在我看来,当您指定WithRequired()时,您似乎试图设置约束,但随后将cascade设置为false。在事件发生时,删除依赖元素db不会更新其他元素,并且会违反约束。为了解决这个问题,试着启用cascade。@GustavoSuarez,cascade正是我想要删除的。无论我是否使用WithOptional(),行为都是一样的。
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);
}