根据http://nhibernate.info/doc/nh/en/index.html#manipulatingdata-exceptions,在数据库异常之后,应该丢弃会话。
现在,在我们的网络应用程序中,在某些情况下,抛出并捕获ADOExceptions是正常的。例如,违反约束。
根据链接的文件,我们应该放弃会议。但是,如果我们遇到约束违规,我们仍然希望对数据库做一些工作,所以我需要一个新的会话。
在我们的测试中,我们通过调用
来完成此操作CurrentSessionContext.Unbind(SessionFactory).Close();
CurrentSessionContext.Bind(SessionFactory.OpenSession());
但在网络应用中我们不使用CurrentSessionContext,我们使用LazySessionContext。因此,我们不能直接在业务类中引用CurrentSessionContext,因为它不是从Web使用的,我们无法引用LazySessionContext,因为在集成测试期间HttpContext不可用。
有没有办法处理和重新创建会话并将其连接到当前上下文,没有直接引用上下文类?我有SessionFactory对象和Session对象。
答案 0 :(得分:0)
如果不想听起来很关键,我建议您需要重新考虑应用程序的设计。您应该通过使用例如组合框来实现接口,或者通过验证来阻止用户输入会导致ADOExceptions的数据,例如违反约束。如果这些情况发生,那么它们就是特殊情况,您可以将其作为内部错误报告给用户,并可能通过单独的机制(例如通过ASP.NET内置的运行状况监视)记录该错误。
我还要补充一点,你的实体可能需要另外看一下,因为当你使用NHibernate时,你通常不需要担心约束违规。