【发布时间】:2018-04-30 22:24:06
【问题描述】:
session.Close() 和 session.Dispose() 有什么区别?
【问题讨论】:
标签: nhibernate
session.Close() 和 session.Dispose() 有什么区别?
【问题讨论】:
标签: nhibernate
来自 Nhibernate 源代码:
private void Dispose(bool isDisposing)
{
using (new SessionIdLoggingContext(base.SessionId))
{
if (!base.IsAlreadyDisposed)
{
log.Debug(string.Format("[session-id={0}] executing real Dispose({1})", base.SessionId, isDisposing));
if (!(!isDisposing || base.IsClosed))
{
this.Close();
}
base.IsAlreadyDisposed = true;
GC.SuppressFinalize(this);
}
}
}
所以 Dispose 方法调用Close()。调用 Close() 或 Dispose() 方法将关闭会话,不允许您再使用它。
【讨论】:
调用session.Close() 将关闭会话但不会释放对象。
调用session.Dispose()(通常通过使用 using 块)将关闭打开的会话,并执行Dispose() 的额外操作。
【讨论】:
这个问题已经有几年的历史了,但它仍然出现在搜索引擎的热门结果中,所以我认为我仍然值得添加评论。另外,我使用的是 NHibernate 5.1.1,所以自从问题最初发布以来,这可能已经发生了变化。
顺便说一句,如果你在TransactionScope 中调用session.Close(),你会得到一个System.Transactions.TransactionAbortedException。如果您查看SessionImpl 中的Close() 方法注释,您会发现:
///
/// Do not call this method inside a transaction scope, use Dispose instead, since
/// Close() is not aware of distributed transactions
///
因此,至少在TransactionScope 的上下文中,必须避免Close()。
【讨论】: