[英]Mixing Nhibernate and ADO transactions?
由于我继承了一个代码库,因此我的要求很奇怪。 DAL基于存储库模式,但是某些存储库使用带有直接SQL和参数化查询的SqlConnection / SqlCommand进行编码,而另一些使用NHibernate进行编码。
我需要执行一系列数据操作,这些操作都需要两个存储库,如果存储库在执行过程中的任何阶段失败,则都需要回滚。 最好的方法是什么?
System.Data公开一个IDbTransaction和NHibernate一个ITransaction,这两个是否兼容? 我可以同时运行两个事务,然后在出现问题时将它们都回滚吗? 在这种情况下,TransactionScope会对我有帮助吗?
nhibernate也支持sql语句 !
我似乎记得方法
NHibernateSession.CreateSQLQuery ,它返回IQuery (实际上是SQLQuery )
您可以继续调用方法List或UniteResult
通常,编码人员喜欢使用名为Hashtable的kv类
您可以在Nhibernate中使用ITransaction。
TransactionScope将创建一个挂钩,该挂钩将通过ADO.Net的所有组件使用。 由于所有 ORM都通过ADO.Net,因此它们都将隐式地接受TransactionScope。 诸如NHibernate,Linq,EF或您选择的任何ORM之类的代码无法抑制这一点,除非它们通过用新的作用域显式覆盖当前作用域来显式抑制TransactionScope。
问题可能是由于由于向服务器中注册了多个连接而导致事务升级到服务器上的分布式事务。 这是一个很滑的主题,受SQL Server / .Net版本的约束,请参阅System.Transactions与SQL Server的集成 。
我假设您想拥有类似于以下代码:
public class SomeService
{
private readonly IRepositoryA _repoA;
private readonly IRepositoryB _repoB;
public void DoStuff(EntityA someEntityA, EntityB someEntityB)
{
try
{
_repoA.Save(someEntityA);
_repoB.Save(someEntityB);
// commit all stuff here
}
catch
{
// rollback all stuff here
}
}
}
如果确实如此,则您需要具有某种类型的UnitOfWork抽象,这两个存储库都依赖于它们,并且可以为它们各自的事务上下文进行引用。 如果两个存储库都使用Nhibernate或IDbConnection / DbTransactions,则会容易得多,但是由于存在混合,您将不得不做更多的工作。
您需要创建一个同时包含IDbTransaction和ITransaction的“ GenericTransaction”,并让您的工作单元具有一种创建新GenericTransaction的方法。
GenericTransaction上的提交/回滚将对两个事务执行相应的操作。
要正确执行此操作,您将不得不对现有的存储库进行相当多的重构……但是我不会推荐任何其他方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.