注意:这个问题更多的是关于数据库设计和SQL Server的,而不是像EF Core这样的特定ORMDB。
我有一个如下所示的数据库架构:
使用EF Core Migration,所有SQL语句都可以运行到最后一个约束(FK_BookReleases_Nicknames_NicknameId
)。可以添加以前的FK FK_BookReleases_Books_BookId
。
我收到的错误是(与关于SO的许多其他文章一样):
介绍FOREIGN KEY约束 表“ BookReleases”上的“ FK_BookReleases_Nicknames_NicknameId”可能 导致循环或多个级联路径。指定ON DELETE NO ACTION或 ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。
我的问题是,该设计的缺陷在哪里?我无法理解在任何逻辑上都会发生这种情况。正确的解决方法是什么?我看到许多建议更改ON DELETE
动作的建议,但没有具体说明我应该使用哪个FK以及其他什么动作。
更糟糕的是,即使已经读过this article,我仍然不明白这可能是一个问题,以及他提出的解决方案如何适合上述方案。
答案 0 :(得分:1)
该问题是由于从作者(祖父母)到BookRelease(孙子女)的多个层叠路径造成的。有两种级联路径:
因此,处理此问题的方法是:
禁用ON DELETE CASCAE,然后选择NOACTION作为外键创建。
在Author(GrandParent),Book(Child1),Nickname(Child2)表中创建INSTEAD OF DELETE触发器,以处理子表中父键的删除。
- 祖父母删除::先删除GrandChild,然后再删除Child1, 其次是Child2
- Child1删除:在GrandChild中删除,然后进行 由Child1
- 删除Child2 :先删除GrandChild,再删除Child2