gpt4 book ai didi

javascript - 级联删除不适用于 Breeze

转载 作者:行者123 更新时间:2023-11-30 12:33:55 26 4
gpt4 key购买 nike

我有一个 Child 表,它有引用另外两个表 Parent1 和 Parent2 的外键(这些不是这些表的真实名称)。 Parent1 和 Parent2 都与祖 parent 具有一对多关系。 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();
}

我收到以下异常。

An exception of type 'System.Exception' occurred in Breeze.ContextProvider.dll but was not handled in user code

Additional information: The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_dbo.Child_dbo.Parent1_Parent1Id". The conflict occurred in database "DB", table "dbo.Parent1", column 'Id'.

The statement has been terminated.

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

最佳答案

Breeze 尚不支持自动级联删除。但是,您可以在代码中执行此类删除。基本上,当您删除父项及其关联的子项时,您有两种选择,执行这些操作的顺序对该过程有重大影响。

  • 先删除父再删除子

    这会将父项标记为已删除,并强制将子项的外键更新为 null 或键的默认值,具体取决于外键属性是否可为空。此规则的一个异常(exception)是 breeze 永远不会尝试修改主键,因此如果子项的外键也是主键的一部分,breeze 将不会尝试修改它。

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

    然后每个 child 都将被标记为已删除。

  • 先删子再删父(推荐)

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

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

关于javascript - 级联删除不适用于 Breeze,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26724082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com