session.Close()和session.Dispose()之间的区别

时间:2011-01-19 20:02:17

标签: nhibernate

session.Close()session.Dispose()之间有什么区别?

3 个答案:

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