【发布时间】:2022-08-18 17:44:20
【问题描述】:
当我添加迁移然后更新数据库然后遇到这个错误:
表上的外键约束\'fk_学生国家_国家ID\' \'students\' 可能会导致循环或多个级联路径。指定 删除无操作或更新无操作,或修改其他外键 约束。无法创建约束或索引。
我面临这种类型的错误。 请帮我找出错误
标签: asp.net entity-framework model-view-controller migration
当我添加迁移然后更新数据库然后遇到这个错误:
表上的外键约束\'fk_学生国家_国家ID\' \'students\' 可能会导致循环或多个级联路径。指定 删除无操作或更新无操作,或修改其他外键 约束。无法创建约束或索引。
我面临这种类型的错误。 请帮我找出错误
标签: asp.net entity-framework model-view-controller migration
想象一下当你有 table1 和 table2 的情况,每个都有一个 foreign key 到彼此的 on delete cascade 规范。
在这种情况下,如果您尝试从 table1 中删除被 table2 中的记录引用的记录,则 RDBMS 将尝试从 table2 中删除该记录。然而,如果 table2 中的记录被 table1 中的记录引用(特别是如果它是初始记录),那么这会触发从 table1 中删除。因此,r1 触发了 r2 的删除,从而触发了 r3 的删除。然而,如果要删除的记录模式重复(无限)多次,那么您将进入无限循环。
以上是记录删除的无限级联循环的最简单方法,更笼统地说
您有 table1, <0 or more tables>, table1 其中每个表在下一个表上级联删除,导致记录删除的无限级联循环。
这是错误警告您的问题类型,它建议您将on delete 行为更改为no action。从技术上讲,这将防止此错误发生,但是可以理解的是,您可能希望触发删除。
一个巧妙的方法可能是拥有一个
on delete set null
并将after update 触发器添加到您以这种方式更改的表中,因此如果给定的foreign key 变为null,则将其删除。我没有测试这种方法,也不清楚您使用的是什么 RDBMS,但值得一试。
如果一切都失败了,那么您可以实现一个存储过程来进行清理并调用该存储过程。
【讨论】: