级联删除无法使用Breeze

Cascade Delete Not Working with Breeze

本文关键字:Breeze 删除 级联      更新时间:2023-09-26

我有一个子表,它有引用另外两个表Parent1&Parent2(这些不是这些表的真实名称)。Parent1&Parent2都与祖父母有一对多的关系。Child表是一个在Parent1和Parent2之间建立多对多关系的联接表,但它作为自己的"映射实体"暴露给Breeze。

我在这两个外键上都设置了级联删除,当我从SQL Server Management Studio中删除Parent1或Parent2表中的一行时,级联工作正常,子表中相应的行也会被删除。

然而,当我使用Breeze 在应用程序中执行以下代码时

function removeParent1(grandParent, parent1) {
    var index = grandParent.parent1s.indexOf(parent1);
    grandParent.parent1s.splice(index, 1);
    parent1.entityAspect.setDeleted();
}

我收到以下例外情况。

中发生类型为"System.exception"的异常Breeze.ContentProvider.dll,但未在用户代码中处理

附加信息:UPDATE语句与FOREIGN KEY约束"FK_dbo.Child_dbo.Parent1_Parent1Id"数据库"DB"、表"dbo.Parent1"、列"Id"中发生冲突。

语句已终止。

我不知道发生了什么。Breeze是否试图用NULL外键更新Child行?

Breeze不支持级联自动删除。但是,您可以在代码中执行这样的删除。基本上,当您删除父级及其关联的子级时,您有两个选择,执行这些操作的顺序会对流程产生重大影响。

  • 删除父项,然后删除子项

    这将标记父项为已删除,并将强制更新子项的外键为null或键的默认值,具体取决于外键属性是否可为null。这个规则的一个例外是,微风永远不会试图修改主键,所以如果子项的外键也是主键的一部分,那么微风就不会试图修改它

    所有子导航属性现在都将返回空数组或null,具体取决于导航属性是否为标量。此时,由于外键的更改,每个子项都将标记为已修改。

    然后,每个子项都将被标记为已删除。

  • 删除子项,然后删除父项(推荐)

    每个子项都将被标记为已删除。外键不会更改,但相应的导航属性将返回null,而不是返回父级。此时,以前返回这些子对象的父对象的所有导航属性现在都将返回null或空数组。父级被标记为已删除。它的任何子代都没有改变(因为目前它没有)。

所以在你的情况下,我会先删除孩子,然后再删除家长。这样,您就不太可能在服务器上保存失败,因为在保存之前不会修改任何子项。