我可以从 NHibernate 获取底层连接和事务对象吗?

Posted

技术标签:

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

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

我需要在同一个事务中将一些 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 方连接重用的问题......希望它变得更清楚;) ;)

以上是关于我可以从 NHibernate 获取底层连接和事务对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

spring获取jdbc链接底层原理

在Sharp Architecture中使用NHibernate处理嵌套事务

NHibernate 为新实体生成 INSERT 和 UPDATE

您是不是应该在 NHibernate 和 Sql Server 2008 中使用外连接获取?

NHibernate - 左连接

NHibernate 事务和竞争条件