我有Child表,其外键引用另外两个表,Parent1& Parent2(这些不是这些表的真实名称)。 Parent1& Parent2与祖父母都有一对多的关系。 Child表是一个连接表,在Parent1和Parent2之间建立多对多关系,但是它作为自己的“映射实体”暴露给Breeze。
我在这两个外键上都有级联删除设置,当我从SQL Server Management Studio中删除Parent1或Parent2表中的一行时,级联正常工作,并删除子表中相应的行。 / p>
但是当我使用Breeze
在我的应用程序中执行以下代码时function removeParent1(grandParent, parent1) {
var index = grandParent.parent1s.indexOf(parent1);
grandParent.parent1s.splice(index, 1);
parent1.entityAspect.setDeleted();
}
我收到以下例外情况。
发生了'System.Exception'类型的异常 Breeze.ContextProvider.dll但未在用户代码中处理
其他信息:UPDATE语句与 FOREIGN KEY约束“FK_dbo.Child_dbo.Parent1_Parent1Id”。该 数据库“DB”,表“dbo.Parent1”,列“Id”中发生冲突。
声明已经终止。
我无法弄清楚发生了什么。 Breeze是否尝试使用NULL外键更新Child行?
答案 0 :(得分:3)
Breeze不会自动支持级联删除。但是,您可以在代码中执行此类删除操作。删除父项及其关联的子项时,基本上有两种选择,执行这些操作的顺序会对该过程产生重大影响。
删除父级,然后删除子级
这会将父标记为已删除,并将根据外键属性是否可为空来强制更新子项的外键为null或键的默认值。此规则的一个例外是breeze永远不会尝试修改主键,因此如果子键的外键也是主键的一部分,那么breeze将不会尝试修改它。
现在,所有子导航属性都将返回空数组或null,具体取决于导航属性是否为标量。此时,由于外键更改,每个子项都将标记为已修改。
然后将每个孩子标记为已删除。
删除子项,然后删除父项(推荐)
每个孩子都会被标记为已删除。外键不会更改,但相应的导航属性将返回null,而不是返回父项。此时,之前返回这些子节点的所有父导航属性现在将返回null或空数组。 父标记已删除。它的任何一个孩子都没有变化(因为此时它没有)。
所以在你的情况下,我会先尝试删除孩子,然后再删除父母。这样,您不太可能在服务器上保存失败,因为在保存之前没有修改任何子项。