2012-10-05 112 views
0

由於我繼承的代碼庫,我有一個相當奇怪的要求。 DAL基於Repository模式,但是一些存儲庫使用SqlConnection/SqlCommand進行直接SQL和參數化查詢編碼,一些使用NHibernate進行編碼。混合Nhibernate和ADO交易?

我需要執行一系列數據操作,需要來自兩個分區的存儲庫,以及它是否在任何階段都需要回滾時出現故障。什麼是最好的方式去做這件事?

System.Data公開一個IDbTransaction和NHibernate一個ITransaction,這兩個是否兼容?我可以同時運行兩個交易嗎?如果出現問題,我們可以將它們兩個都回滾一下嗎? TransactionScope會在這種情況下幫助我嗎?

+0

你可以簡單地嘗試一下...或谷歌它... –

回答

1

nhibernate同樣支持sql語句

我似乎記得方法

NHibernateSession.CreateSQLQuery,它返回IQUERY(其實這是的SQLQuery

,你可以去調用方法列表UniteResult

通常,編碼者喜歡使用kv類nam ed Hashtable

你可以在Nhibernate中使用ITransaction。

1

TransactionScope將創建一個鉤子,所有通過ADO.Net的組件都將遵守該鉤子。由於全部 ORM通過ADO.Net,所有這些都將隱含地兌現TransactionScope。像NHibernate或Linq或EF或任何您選擇的ORM代碼不能取消這一點,除非他們明確禁止明確覆蓋當前範圍與一個新的TransactionScope。

問題可能是由於多個連接註冊到服務器上,事務升級到分佈式事務。這是一個很滑的主題,受SQL Server/.Net版本支持,請參閱System.Transactions Integration with SQL Server

1

我假設你想擁有類似下面的代碼:

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上的提交/回滾將對兩個事務執行相應的操作。

要做到這一點,你將不得不重構你現有的回購相當多的...但我不會推薦任何其他方式。