约束可能导致循环或多个级联路径

时间:2019-10-02 13:13:06

标签: sql-server entity-framework foreign-keys ef-migrations

它是这样的:

Update-Database

然后我尝试datetimeoffset大喊:

  

在表'InvoicePaymentParticipants'上引入FOREIGN KEY约束'relationship_name'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他> FOREIGN KEY约束。   无法创建约束或索引。查看以前的错误。

我误解了多个级联路径的概念。

我不明白问题出在哪里,因为如果我们想删除经理,我们也希望他们的付款参与记录以及他们创建的发票都被删除。

您如何在给定的架构中解决此问题?

1 个答案:

答案 0 :(得分:5)

默认情况下,当您在必需(或非空)属性上创建外键关系时,将启用级联删除,请参见EF required relationship

这里的问题是您有2个从InvoicePaymentParticipantApplicationUser表的级联删除路径:

Path1: InvoicePaymentParticipant -> InvoicePayment -> Invoice -> ApplicationUser

Path2: InvoicePaymentParticipant -> ApplicationUser

这意味着,当您删除用户时,应删除以下记录:

路径1下的删除

  1. 删除用户时,请删除其发票
  2. 删除发票时,请删除相应的发票付款
  3. 删除发票付款时,请删除相应的发票付款参与者

路径2下的删除

  1. 删除用户时,请删除其发票付款参与者

这在Sql Server中是不允许的。有关更多信息,请参见this page

要解决该问题,您可以重新考虑表结构并删除从InvoicePaymentParticipantApplicationUser ...的外键路径之一。

另一种方法是更改​​外键的级联删除行为,您可以删除[Required]属性之一上的ManagerId属性,并且由于string是{{ 1}}类型,则EF会将key to null设置为删除。

您还可以更改EF默认行为和turn off cascading delete