我可以从 NHibernate 获取底层连接和事务对象吗?
Posted
技术标签:
【中文标题】我可以从 NHibernate 获取底层连接和事务对象吗?【英文标题】:Can I get the underlying conneciton and transaction objects from NHibernate? 【发布时间】:2017-03-07 00:17:03 【问题描述】:是否可以从 NHibernate 事务中获取 DbConnection
和 DbTransaction
对象?
我需要在同一个事务中将一些 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 获取底层连接和事务对象吗?的主要内容,如果未能解决你的问题,请参考以下文章
在Sharp Architecture中使用NHibernate处理嵌套事务
NHibernate 为新实体生成 INSERT 和 UPDATE