1

您好,我在使用微风js时遇到级联删除问题,顺便说一句,我认为它很摇滚。具体来说,我使用带有 AngularJS 和 BreezeJS(1.3.1 版本)的 Asp.net Mvc SPA 模板。我有一个具有电话对象导航属性的客户对象。电话对客户的 FK 设置为 NotNull 和 Cascade Delete。

我的问题是当试图删除客户端上的父客户并调用 SaveChanges (这是一个 Web Api 方法)时,我在 SqlServer 上得到一个 DbUpdateException “更新语句与前键约束冲突......”。

尽管我没有明确编辑电话,但我看到微风客户端发回标记为已删除的客户对象和标记为已修改的电话对象。

显然,将 Phone 上的 FK 设置为可为空时,我也不例外,父 Customer 对象被删除但 Phone 对象没有被删除,而是其对 Customer 的 FK 设置为 null。

我也希望删除 Phone 对象,但将 FK 列保持为 notnull。我将不胜感激任何帮助。

编辑更新:

那么问题是我猜当你在客户端上调用 EntityManager.saveChanges() 时。如果您删除 Customer 父对象,它的 entityState 将设置为已删除,并且所有 FK 引用都设置为 null,就像在 Phone 对象中一样,该对象现在具有 EnityState “Modified”。但是对 EntityManager.saveChanges() 的调用将导致服务器中的更新和删除,从而导致冲突是电话上的 FK 设置为“非空”。调用 EntityManager.saveChanges([Customer]) 可能有效。

#

谢谢你。

4

1 回答 1

1

您的评估是正确的,我会尝试添加更多。

当您为客户调用 setDeleted() 时,微风会清空所有引用 fkey 值 - 在您的情况下:在电话记录中。结果是客户处于删除状态,电话处于修改状态。调用 saveChanges 会导致电话更新和客户删除。如果手机的客户引用可以为空,这应该会成功(假设 UPDATE 在 DELETE 之前完成)。如果它不可为空,我预计会出现客户端错误,称手机的客户参考为空。但是,如果客户端没有捕捉到它,那么服务器就会捕捉到它。

你说你想和客户一起删除电话。您可以设置客户级联删除。然后, saveChanges([Customer]) 应该可以工作。之后,您可能应该从缓存中删除(分离)该电话记录,因为它实际上已经消失了。如果您之后尝试保存它,服务器将在 UPDATE 语句上失败,因为该记录不存在。

或者我认为您也可以在电话记录上调用 setDeleted,然后调用 saveChanges() 来保存两者。我假设微风会做两次删除。我认为它也不会尝试更新记录。

于 2014-02-04T16:06:34.123 回答