级联删除不适用于微风

时间:2014-11-03 22:03:46

标签: javascript sql-server entity-framework ef-code-first breeze

我有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行?

1 个答案:

答案 0 :(得分:3)

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

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

    这会将父标记为已删除,并将根据外键属性是否可为空来强制更新子项的外键为null或键的默认值。此规则的一个例外是breeze永远不会尝试修改主键,因此如果子键的外键也是主键的一部分,那么breeze将不会尝试修改它。

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

    然后将每个孩子标记为已删除。

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

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

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