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);
}