【问题标题】:Difference between session.Close() and session.Dispose()session.Close() 和 session.Dispose() 之间的区别
【发布时间】:2018-04-30 22:24:06
【问题描述】:

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

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    来自 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() 方法将关闭会话,不允许您再使用它。

    【讨论】:

      【解决方案2】:

      调用session.Close() 将关闭会话但不会释放对象。

      调用session.Dispose()(通常通过使用 using 块)将关闭打开的会话,并执行Dispose() 的额外操作。

      【讨论】:

        【解决方案3】:

        这个问题已经有几年的历史了,但它仍然出现在搜索引擎的热门结果中,所以我认为我仍然值得添加评论。另外,我使用的是 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()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-25
          • 2020-05-10
          • 2014-09-20
          • 2010-10-28
          • 2015-10-04
          • 2012-08-12
          • 2011-02-18
          相关资源
          最近更新 更多