NHibernate异常“Session已关闭!对象名称:'ISession'。”

3

我从NHibernate得到以下错误:

System.ObjectDisposedException: Session is closed! Object name: 'ISession'.
   at NHibernate.Impl.AbstractSessionImpl.ErrorIfClosed()
   at NHibernate.Impl.AbstractSessionImpl.CheckAndUpdateSessionStatus()
   at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
   at NHibernate.Impl.SessionImpl.Save(Object obj)

我在 .net windows service 中使用 NHibernate。我无法确定导致异常的确切问题。这个异常经常出现。有没有人能帮我解决这个异常?


nrk


是的..我正在打开连接。实际上,我正在做一个文件导入应用程序,在其中使用会话逐批(200)进行记录插入,并提交会话,这些记录也可在数据库中使用,但在2或3个批次后它会出现异常。我无法弄清楚原因。 - nRk
3个回答

6
我猜你可能在多个地方使用using语句来包装你的会话,类似于下面这样的代码。你能否发布一些你使用会话的代码?
希望对你有所帮助, Berryl
错误 - 第一个using语句之后会话就被关闭了:
using(var session = _sessionFactory.GetCurrentSession()
using(var tx = _session.BeginTransaction(){
    ... do something
    tx.Commit();
}


using(var session = _sessionFactory.GetCurrentSession()
using(var tx = _session.BeginTransaction(){
    ... do something else
}

更好的方式是,在任务完成后关闭会话。
var session = _sessionFactory.GetCurrentSession();

using(var tx = _session.BeginTransaction(){
    ... do something
    tx.Commit();
}


using(var tx = _session.BeginTransaction(){
    ... do something else
    tx.Commit()
}
session.Close()

2

根据错误提示,看起来你在ISession关闭后尝试保存对象。你确定已经打开了它吗?或者它是不是过早地被关闭了?

更新: 你有检查NHibernate日志吗?


看起来很相似,但将层叠设置为none解决了问题。 - nRk
很高兴你已经解决了。但如果我是你,我会确保查看nhibernate log4net日志,以获取更多关于正在发生的事情的信息,请参见:http://stackoverflow.com/questions/743323/nhibernate-enabling-log4net - UpTheCreek
1
@vapcguy 请参见上面的链接。 - UpTheCreek
@UpTheCreek - 谢谢 -- 换句话说,确保你自己记录它们,使用log4NET或其他工具。 - vapcguy

0
我们曾经遇到过同样的问题。将应用程序池托管管道改为Classic对我们很有帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接