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

时间:2010-03-31 12:19:14

标签: c# .net nhibernate

我从NHibernate得到了folloinwg错误:

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服务中使用NHibernate。
我无法追踪异常的精确问题。这种例外经常发生 任何人都可以帮我解决这个问题吗?


NRK

3 个答案:

答案 0 :(得分:6)

我猜你是不止一次将你的会话包装在一个using构造中,如下所示。你能发布一些会话使用代码吗?

HTH,
Berryl

错误 - 会话在第一次使用构造后关闭:

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()

答案 1 :(得分:2)

正如错误所示 - 当您的ISession关闭时,您似乎正在尝试保存对象。你确定要打开吗?或者它可能过早关闭了?

更新: 你检查过NHibernate Logs了吗?

答案 2 :(得分:0)

我们遇到了同样的问题。将App Pool Managed Pipeline更改为Classic为我们解决了这个问题。