我使用具有几个父表的数据库优先实体框架从C#到DB的连接。为简单起见,我们称之为表A(父母之一)。此表连接到25个不同的其他表,其中包含源自TABLE A的外键。但是,这些子表可能具有自己的子表。
例如:
A -> B
A -> C -> D
A -> E
父母与子女的父母与其子女之间的关系通常为0.1到多数。对于所有连接字符串,我已将所有End1 OnDelete设置为Cascade。我还将CHILD设置为他们的SUBCHILD到Cascade for End1 OnDelete。所以A - > C和C - > D End1 OnDelete设置为Cascade。但是,当我从A执行删除id = 5时,它仍然无法说明外键约束。但是如果我将表修改为只有没有自己的CHILD的孩子,即:
F -> G
F -> H
F -> I
如果我从没有问题的id = 2的表F中删除,并且他们的CHILD也会被删除,这将有效。
我知道对于代码优先的实体框架,我们可以做类似
的事情modelBuilder.Entity<User>()
.HasOptional(a => a.UserDetail)
.WithOptionalDependent()
.WillCascadeOnDelete(true);
但我坚持使用数据库优先。另外,我真的不想循环遍历每个表并先删除最小的孩子然后循环 - 我很确定有比两者更好的方法。
我认为问题是如果PARENT有GRANDCHILD那么这就成了数据库第一种方法的级联DELETE的问题。