最近在使用NHibernate的时候,遇到一个很奇怪的问题。在调用Session.SaveOrUpdate()方法的时候,抛出了异常。
看下面的截图,虽然是这个异常是VS在catch这行代码捕捉到的,但是真正出问题的,是在try的代码块的内部。关于如何让VS在问题发生出捕捉并且提示,在我的其他的博客文章中有一篇详细介绍了,这里不再多说。
抛出异常的代码如下:
归根到底,是调用Session.SaveOrUpdate()的时候抛出的异常。而且我去找Excepition的详细内容,看看有没有什么提示,但是根本没有什么InnerExcetion与Message等有价值的线索。后来 我就一直思考为什么会出现问题,最终找到了问题的根结所在,是current_session_context_class出了问题。
情景是这样的。我的项目是一个web项目,在项目中用到了NHibernate,然后我把配置写在了web.config中。之后我又写了一些新的方法,然后建立了一个UnitTest项目,之后需要把Nhibernate相关的内容都移过去,目的是为了测试这些service方法。我就把web.config中的内容拷贝到了UnitTest项目的app.config中,而NHibernate中的session上下文依然是web,这就是导致了问题的原因。
之后我把它改成thread_static,问题就解决了。原因就是UnitTest的项目没有IIS的那套东西,如果此时还是从web中获取session,那么就会是个null,所以抛出了异常。