Template
可以有零个或多个Document
,零个或多个MetaIndex
。 Document
可以有零个或多个Index
,而MetaIndex
也可以有零个或多个Index
:
这表示潜在的级联问题,因为删除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约束。无法创建约束。查看以前的错误。
答案 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);
}