使用Entity Framework Code First复杂级联删除

时间:2015-03-16 16:10:13

标签: c# sql sql-server database entity-framework

我正在使用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拒绝删除。

  • A - 级联 - &gt;乙
  • B - 级联 - &gt; ç
  • C - 级联 - &gt; d
  • C - 级联 - &gt; ë
  • D - 级联 - &gt; ë
  • E - 级联 - &gt; F(F包含D_ID)

这是一张让人们更容易理解的图片: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”。

你会如何解决这个问题?请记住,模型比这更复杂,类似的情况会重复思考模型。您可以假设模型中没有循环级联删除,因为这种情况是手动处理的。

1 个答案:

答案 0 :(得分:0)

我不明白你的上一句话是什么,因为你的问题正是你的模型中有一个循环依赖:D - &gt; E - &gt; F - &gt; d

由于参照完整性始终保留,因此只要存在循环依赖关系,就无法成功删除。如果例如要删除的每个F行中的D_Id为空,则可以在保留FK关系的同时将其中断。然后它将工作,因为受影响的行已经消失了。

循环依赖关系不是质量设计的好兆头。我会劝你重新考虑一下。