session.Close()
和session.Dispose()
之间有什么区别?
答案 0 :(得分:22)
来自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()
方法会关闭会话,不再允许您使用它。
答案 1 :(得分:9)
调用session.Close()
将关闭会话但不会丢弃该对象。
调用session.Dispose()
(通常通过使用使用块)将关闭会话(如果会话已打开)以及执行Dispose()
的额外操作。
答案 2 :(得分:1)
这个问题现在已经有几年了,但它仍然通过搜索引擎显示在最佳结果中,所以我认为我仍然值得添加评论。此外,我使用的是NHibernate 5.1.1,因此,自问题最初发布以来,这可能已经发生了变化。
结果表明,如果您在session.Close()
内拨打TransactionScope
,您将获得System.Transactions.TransactionAbortedException
。如果您查看Close()
中的SessionImpl
方法备注,您会发现:
///
/// Do not call this method inside a transaction scope, use Dispose instead, since
/// Close() is not aware of distributed transactions
///
因此,至少在TransactionScope
的上下文中,必须避免使用Close()
。