Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理StaleObjectStateException的位置_C#_Asp.net Mvc_Nhibernate_Exception Handling_Optimistic Locking - Fatal编程技术网

C# 处理StaleObjectStateException的位置

C# 处理StaleObjectStateException的位置,c#,asp.net-mvc,nhibernate,exception-handling,optimistic-locking,C#,Asp.net Mvc,Nhibernate,Exception Handling,Optimistic Locking,我应该使用try-catch块包装对存储库的调用,以在ASP.NET MVC应用程序中的相应控制器内捕获/处理StaleObjectStateException,还是应该在存储库实现内执行 另外,我如何处理异常,通知用户。据我所知,不打算回滚 谢谢 如果正确使用,将这种异常管理放在控制器中将打破关注点的分离 控制器属于表示层,表示层不知道您正在使用什么来存储数据,StaleObjectStateException是NHibernate的东西。如果您正确使用,将这种异常管理放在控制器中会打破您的关

我应该使用try-catch块包装对存储库的调用,以在ASP.NET MVC应用程序中的相应控制器内捕获/处理StaleObjectStateException,还是应该在存储库实现内执行

另外,我如何处理异常,通知用户。据我所知,不打算回滚

谢谢

如果正确使用,将这种异常管理放在控制器中将打破关注点的分离

控制器属于表示层,表示层不知道您正在使用什么来存储数据,StaleObjectStateException是NHibernate的东西。

如果您正确使用,将这种异常管理放在控制器中会打破您的关注点分离


控制器属于表示层,表示层不知道您正在使用什么来存储数据,StaleObjectStateException是NHibernate的东西。

问题归结为一个不同的问题:在哪里以及如何处理实体的并发修改?即:用户A和用户B编辑同一条记录,当稍后保存该记录的用户B收到StaleObjectStateException,因为他编辑的版本现在已过期

以下是一些想法:

通过暴力强制使用户B的版本成为正确的版本,例如,通过从数据库检索记录的当前版本,并将用户B版本的整个状态应用于它。如果用户A更改了电子邮件地址字段,而用户B更改了用户名字段,则会出现问题。使用这种方法,用户A所做的一切都消失了。在这种方法中,您将捕获StaleObjectStateException并修复存储库中的所有内容

智能方法:与方法1类似,存储库中的所有内容都是固定的,即它完全捕获并处理StaleObjectStateException,但它使用领域知识有选择地仅应用用户B所做的一些更改。例如,如果用户A更改了电子邮件地址,用户B更改了用户名,这些更改不会相互排斥,因此存储库只能更新电子邮件地址。如果记录的两个方面同时发生了变化,而这两个方面并不直接相互依赖,那么这种方法就可以很好地工作。实现此解决方案可能相当复杂,具体取决于您希望的智能程度

拒绝存储库中的并发更改。在这种情况下,如果发生StaleObjectStateException,存储库需要报告无法保存记录。它实际上可能只是让异常冒泡出来,但随后您将NHibernate泄漏到例如控制器。相反,您可以抛出自己的异常,其中包含对您的域有意义的更有用的细节。在这种情况下,控制器是捕获该异常的好地方。然后,您可以选择不同的操作方式,例如:

通知用户由于另一个用户同时进行更改而无法保存记录,并将所有更改扔掉,迫使他从头开始做所有事情。这对用户来说当然是痛苦的,只有在很少发生这种情况时才应该这样做。 将问题告知用户,并让用户决定要做什么,例如强制更改或重新开始。
虽然这超出了您的问题范围,但我希望这仍然对您有所帮助。

问题归结为一个不同的问题:在哪里以及如何处理实体的并发修改?即:用户A和用户B编辑同一条记录,当稍后保存该记录的用户B收到StaleObjectStateException,因为他编辑的版本现在已过期

以下是一些想法:

通过暴力强制使用户B的版本成为正确的版本,例如,通过从数据库检索记录的当前版本,并将用户B版本的整个状态应用于它。如果用户A更改了电子邮件地址字段,而用户B更改了用户名字段,则会出现问题。使用这种方法,用户A所做的一切都消失了。在这种方法中,您将捕获StaleObjectStateException并修复存储库中的所有内容

智能方法:与方法1类似,存储库中的所有内容都是固定的,即它完全捕获并处理StaleObjectStateException,但它使用领域知识有选择地仅应用用户B所做的一些更改。例如,如果用户A更改了电子邮件地址,用户B更改了用户名,这些更改不会相互排斥,因此存储库只能更新电子邮件地址。如果记录的两个方面同时发生了变化,而这两个方面并不直接相互依赖,那么这种方法就可以很好地工作。实现此解决方案可能相当复杂,具体取决于您希望的智能程度

拒绝存储库中的并发更改。在这种情况下,如果发生StaleObjectStateException,存储库需要报告它无法保存记录 D它实际上可能只是让异常冒泡出来,但随后您将NHibernate泄漏到例如控制器。相反,您可以抛出自己的异常,其中包含对您的域有意义的更有用的细节。在这种情况下,控制器是捕获该异常的好地方。然后,您可以选择不同的操作方式,例如:

通知用户由于另一个用户同时进行更改而无法保存记录,并将所有更改扔掉,迫使他从头开始做所有事情。这对用户来说当然是痛苦的,只有在很少发生这种情况时才应该这样做。 将问题告知用户,并让用户决定要做什么,例如强制更改或重新开始。 虽然这超出了你的问题,但我希望这仍然对你有帮助