Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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
Asp.net mvc 3 在数据库异常后重新启动NHibernate会话,不带CurrentContext_Asp.net Mvc 3_Nhibernate - Fatal编程技术网

Asp.net mvc 3 在数据库异常后重新启动NHibernate会话,不带CurrentContext

Asp.net mvc 3 在数据库异常后重新启动NHibernate会话,不带CurrentContext,asp.net-mvc-3,nhibernate,Asp.net Mvc 3,Nhibernate,根据,在数据库异常之后,会话应该被丢弃 现在,在我们的web应用程序中,在某些情况下,抛出并捕获异常是正常的。例如,约束冲突 根据与会议相关的文件,我们应该放弃会议。但是,如果遇到约束冲突,我们仍然希望对数据库进行一些处理,因此我需要一个新会话 在我们的测试中,我们通过调用 CurrentSessionContext.Unbind(SessionFactory).Close(); CurrentSessionContext.Bind(SessionFactory.OpenSession());

根据,在数据库异常之后,会话应该被丢弃

现在,在我们的web应用程序中,在某些情况下,抛出并捕获异常是正常的。例如,约束冲突

根据与会议相关的文件,我们应该放弃会议。但是,如果遇到约束冲突,我们仍然希望对数据库进行一些处理,因此我需要一个新会话

在我们的测试中,我们通过调用

CurrentSessionContext.Unbind(SessionFactory).Close();
CurrentSessionContext.Bind(SessionFactory.OpenSession());
但在web应用程序中,我们不使用CurrentSessionContext,而是使用。因此,我们不能在我们的业务类中直接引用CurrentSessionContext,因为它不是从web上使用的,我们也不能引用LazySessionContext,因为在集成测试期间HttpContext不可用


是否有一种方法可以在不直接引用上下文类的情况下处置和重新创建会话并将其连接到当前上下文?我有SessionFactory对象和Session对象

在不想听起来很挑剔的情况下,我建议您需要重新考虑应用程序的设计。例如,您应该通过使用组合框或验证来实现一个接口,以防止用户输入可能导致异常(如违反约束)的数据。如果发生这些情况,则属于例外情况,您可以将其作为内部错误报告给用户,并可能通过单独的机制(例如通过ASP.NET内置的运行状况监视)记录该错误


我还要补充一点,您的实体可能需要另一种外观,因为当您使用NHibernate时,通常不需要担心违反约束。

在多用户应用程序中,这并不是那么容易。如果用户A试图在用户B删除EntityB后一秒钟保存一个新EntityA并引用一个EntityB怎么办?@cremor根据您的使用情况实施乐观锁定或悲观锁定。乐观锁定失败也是例外。并且只要任何用户有EntityA的编辑或创建UI,锁定所有可以从EntityA引用的表都是不可行的。@cremor锁定EntityA在某些情况下可能是可行的。但是我同意你关于乐观锁定的观点,你应该防止用户界面上的保存,用户A同时做用户B正在做的事情的可能性非常小。在UI上阻止它,使用DB约束对其进行故障保护。然后适当地处理异常。在这种情况下,保存失败,这是您的UoW,在该UoW中执行其他操作不应属于同一会话。更新了NHibernate引用的链接: