BreezeJS级联删除非空FK

时间:2013-04-30 08:54:17

标签: breeze

你好我在使用breezejs时出现级联删除问题,顺便说一下,我觉得它很糟糕。具体来说,我使用带有AngularJS和BreezeJS(1.3.1版本)的Asp.net Mvc SPA模板。我有一个具有Phone对象导航属性的Customer对象。 Phone的FK为Customer,设置为NotNull和Cascade Delete。

我的问题是当尝试删除客户端上的父Customer并调用SaveChanges(这是一个Web Api方法)时,我在SqlServer上获得了一个DbUpdateException“Update语句与foreigh key约束冲突....”。

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

显然,当将Phone上的FK设置为​​nullable时,我也没有例外,父Customer对象被删除但Phone对象没有被删除,而是它的FK to Customer被设置为null。

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

编辑更新:

问题是我猜你在客户端调用EntityManager.saveChanges()时。如果删除Customer父对象,则其entityState设置为deleted,并且所有FK引用都设置为null,如现在具有EnityState“Modified”的Phone对象中所示。但是对EntityManager.saveChanges()的调用将导致服务器中的Update和Delete导致冲突,即Phone上的FK设置为​​“Not Null”。调用EntityManager.saveChanges([Customer])可能有效。

谢谢。

1 个答案:

答案 0 :(得分:1)

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

当您为客户调用setDeleted()时,breeze会将所有引用fkey值的空值取消 - 在您的情况下:在电话记录中。结果是客户处于已删除状态,手机处于已修改状态。调用saveChanges会导致手机更新和客户删除。如果phone的customer ref可以为空,那么这应该成功(假设UPDATE在DELETE之前完成)。如果它是不可空的,我会期望客户端错误说电话的客户引用是空的。但是,如果客户端没有捕获它,那么服务器就会。

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

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