Javascript 级联删除不使用Breeze
我有一个子表,它的外键引用了另外两个表Parent1和Parent2(它们不是这些表的真实名称)。Parent1和Parent2都与祖父母有一对多的关系。子表是一个连接表,在Parent1和Parent2之间建立了多对多关系,但它作为自己的“映射实体”公开给Breeze 我在这两个外键上都设置了cascade delete,当我从SQLServerManagementStudio中删除Parent1或Parent2表中的一行时,cascade工作正常,并且子表中的相应行被删除 但是,当我使用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
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:看来这个功能还没有实现。