Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 级联删除不使用Breeze_Javascript_Sql Server_Entity Framework_Ef Code First_Breeze - Fatal编程技术网

Javascript 级联删除不使用Breeze

Javascript 级联删除不使用Breeze,javascript,sql-server,entity-framework,ef-code-first,breeze,Javascript,Sql Server,Entity Framework,Ef Code First,Breeze,我有一个子表,它的外键引用了另外两个表Parent1和Parent2(它们不是这些表的真实名称)。Parent1和Parent2都与祖父母有一对多的关系。子表是一个连接表,在Parent1和Parent2之间建立了多对多关系,但它作为自己的“映射实体”公开给Breeze 我在这两个外键上都设置了cascade delete,当我从SQLServerManagementStudio中删除Parent1或Parent2表中的一行时,cascade工作正常,并且子表中的相应行被删除 但是,当我使用Br

我有一个子表,它的外键引用了另外两个表Parent1和Parent2(它们不是这些表的真实名称)。Parent1和Parent2都与祖父母有一对多的关系。子表是一个连接表,在Parent1和Parent2之间建立了多对多关系,但它作为自己的“映射实体”公开给Breeze

我在这两个外键上都设置了cascade delete,当我从SQLServerManagementStudio中删除Parent1或Parent2表中的一行时,cascade工作正常,并且子表中的相应行被删除

但是,当我使用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语句与 外键约束“FK_dbo.Child_dbo.Parent1\u Parent1Id”。这个 数据库“DB”、表“dbo.Parent1”、列“Id”中发生冲突

声明已终止


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

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

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

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

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

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

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

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


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

这就是我最终采取的路线(先删除子对象,然后删除父对象),但我希望有一种方法将此逻辑向下推到数据库中,以便尽可能地封装数据模型的复杂性。我想这可以通过一个而不是删除或删除后来完成,但是在客户端这样做更有意义,因为我想在删除依赖项的实体时弹出一个“删除此项也将删除这些…”警告。同时是否对Breeze代码进行了更新以处理级联?目前我正在为Breeze实现一个基于django的服务器接口,并且遇到了完全相同的问题。@NielsvanEldik:看来这个功能还没有实现。