我正在使用Code First的Entity Framework,我遇到了级联删除问题。由于我的模型不是很小,我需要关闭它们,因为否则会有一些循环删除,SQL Server无法解析。
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
之后,我手动指定了哪些实体应该使用Fluent API级联删除,例如:
modelBuilder.Entity<First>().HasRequired(x => x.Second).WithMany().WillCascadeOnDelete(true);
但是,我在测试期间遇到了问题。
这是模型的样子。字母A到F表示实体,箭头指向应在链中删除的下一个实体(更像是树,但我简化它以指出问题出在哪里)。
问题是中间的一个实体无法删除,因为其末端的实体包含中间实体的外键。尽管两个实体都会被删除,但SQL Server拒绝删除。
这是一张让人们更容易理解的图片:http://www.deviantpics.com/images/2015/03/16/deletion_treee3udl.png
当我尝试删除实体“A”时,我收到以下消息:
DELETE语句与REFERENCE约束冲突\“FK_dbo.F_dbo.D_Id \”
这非常令人讨厌,因为SQL Server应该能够确定在请求删除A时可以安全地删除“D”和“F”。
你会如何解决这个问题?请记住,模型比这更复杂,类似的情况会重复思考模型。您可以假设模型中没有循环级联删除,因为这种情况是手动处理的。
答案 0 :(得分:0)
我不明白你的上一句话是什么,因为你的问题正是你的模型中有一个循环依赖:D - &gt; E - &gt; F - &gt; d
由于参照完整性始终保留,因此只要存在循环依赖关系,就无法成功删除。如果例如要删除的每个F行中的D_Id为空,则可以在保留FK关系的同时将其中断。然后它将工作,因为受影响的行已经消失了。
循环依赖关系不是质量设计的好兆头。我会劝你重新考虑一下。