你好我在使用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列不可用。我将不胜感激任何帮助。
编辑更新:
谢谢。
答案 0 :(得分:1)
您的评估是正确的,我会尝试添加更多。
当您为客户调用setDeleted()时,breeze会将所有引用fkey值的空值取消 - 在您的情况下:在电话记录中。结果是客户处于已删除状态,手机处于已修改状态。调用saveChanges会导致手机更新和客户删除。如果phone的customer ref可以为空,那么这应该成功(假设UPDATE在DELETE之前完成)。如果它是不可空的,我会期望客户端错误说电话的客户引用是空的。但是,如果客户端没有捕获它,那么服务器就会。
您说要与客户一起删除手机。您可以设置客户级联删除。然后,saveChanges([Customer])应该工作。之后,您可能应该从缓存中逐出(分离)该电话记录,因为它实际上已经消失了。如果您之后尝试保存它,则服务器将在UPDATE语句上失败,因为该记录不存在。
或者我认为您也可以在电话记录上调用setDeleted,然后调用saveChanges()来保存两者。我假设微风会做两个DELETE。我假设它不也尝试更新记录。