BreezeJS级联删除,带非空FK

BreezeJS级联删除,带非空FK,breeze,Breeze,您好,我在使用breezejs时遇到了cascade delete的问题,顺便说一句,我觉得它很震撼。具体来说,我将Asp.net Mvc SPA模板与AngularJS和BreezeJS(1.3.1版本)结合使用。我有一个具有电话对象导航属性的客户对象。手机的FK to Customer设置为NotNull并级联删除 我的问题是,当尝试删除客户机上的父客户并调用SaveChanges(这是一个Web Api方法)时,我在SqlServer上得到一个DbUpdateException“Updat

您好,我在使用breezejs时遇到了cascade delete的问题,顺便说一句,我觉得它很震撼。具体来说,我将Asp.net Mvc SPA模板与AngularJS和BreezeJS(1.3.1版本)结合使用。我有一个具有电话对象导航属性的客户对象。手机的FK to Customer设置为NotNull并级联删除

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

我看到breezejs客户端发回标记为已删除的Customer对象和标记为已修改的Phone对象,尽管我没有显式地编辑手机

显然,当将FK on Phone设置为null时,我没有例外,父客户对象被删除,但电话对象未被删除,而其FK to Customer设置为null

我希望电话对象也被删除,但保持FK列为notnull。我将感谢任何帮助

编辑更新:

问题是,我想当您在客户端上调用EntityManager.saveChanges()时。如果删除客户父对象,则其entityState将设置为deleted,所有FK引用将设置为null,就像电话对象中的一样,该对象现在的entityState为“Modified”。但是调用EntityManager.saveChanges()将导致服务器中的更新和删除,从而导致冲突,因为手机上的FK设置为“Not Null”。调用EntityManager.saveChanges([Customer])可能会起作用。 #
谢谢。

您的评估是正确的,我将尝试添加更多内容

当您为客户调用setDeleted()时,breeze会将所有引用的fkey值都置空——在您的情况下:在电话记录中。结果是客户处于删除状态,手机处于修改状态。调用saveChanges会导致手机更新和客户删除。如果手机的customer ref可为空,则应成功执行此操作(假设更新在删除之前完成)。若它不可为null,那个么我希望出现一个客户端错误,表明手机的客户参考为null。但是,如果客户机没有捕获到它,那么服务器就会

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


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

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

当您为客户调用setDeleted()时,breeze会将所有引用的fkey值都置空——在您的情况下:在电话记录中。结果是客户处于删除状态,手机处于修改状态。调用saveChanges会导致手机更新和客户删除。如果手机的customer ref可为空,则应成功执行此操作(假设更新在删除之前完成)。若它不可为null,那个么我希望出现一个客户端错误,表明手机的客户参考为null。但是,如果客户机没有捕获到它,那么服务器就会

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


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

实际上,我必须在删除所有实体后执行
保存更改([电话,客户])
以保持缓存更新,如您所述。实际上,我必须在删除所有实体后执行
保存更改([电话,客户])
以保持缓存更新,如您所述