【问题标题】:Can I get the underlying conneciton and transaction objects from NHibernate?我可以从 NHibernate 获取底层连接和事务对象吗?
【发布时间】:2017-03-07 00:17:03
【问题描述】:

是否可以从 NHibernate 事务中获取 DbConnectionDbTransaction 对象?

我需要在同一个事务中将一些 NHibernate 调用与第三方库结合起来。

【问题讨论】:

    标签: c# sql nhibernate


    【解决方案1】:

    ISession.Connection 返回IDBConnection 对象。有关交易,请参阅下面的博客文章。

        //http://ayende.com/blog/1583/i-hate-this-code
    
        private static IDbTransaction GetTransaction(ISession session)
    
        {
            using (var command = session.Connection.CreateCommand())
            {
                session.Transaction.Enlist(command);
                return command.Transaction;
            }
        }
    

    【讨论】:

      【解决方案2】:

      我们可以在 NHibernate 会话中启动事务,并轻松获得对 DbConnection 的访问权限(甚至可以转换为 SQL 或 Oracle 之一 - 如果有意义的话)。然后用它做这些事情并应用最终的提交/回滚:

      var session = ... // get an NHiberante ISession
      var transaction = session.BeginTransaction();
      
      var conn = session.Connection;
      var dbConnection = conn as System.Data.Common.DbConnection;
      
      // do the stuff with DbConnection
      
      transaction.Commit();
      // or
      transaction.Rollback();
      

      【讨论】:

      • 如何访问 DbTransaction 对象?
      • 事务是为您的连接共享的。所以您可以在会话中或稍后在您的 DbConnection 上创建一个。实际上它仍然是相同的事务。希望有所帮助;)
      • 嗯。现在我想知道为什么 DbCommand 甚至首先有一个 Transaction 属性。
      • 为什么不呢?问题出在哪里?您可以在某处开始您的交易并仅共享一个连接。稍后,通过触摸 Transaction 属性,您可以提交/回滚您的东西。这将是一个影响所有声明的声明......在交易创建后发布。正如我所说.. 它可以在会话或数据库连接上创建.. 因为实际上.. 下面是相同的。它更多的是了解基本的 ADO.NET,然后是 NHiberante 和 3d 方连接重用的问题......希望它变得更清楚;) ;)
      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 2015-12-02
      • 2011-06-02
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多