2012-10-17 67 views
4

我有一個相當大的數據庫,其中包含爲不同業務模塊創建的表。如何在EF4中爲多個ObjectContexts實現單個SQL事務

我們決定分別爲不同的模塊創建不同的edmx文件。

但是,如何防止嘗試實現TransactionScope的邏輯操作時會使用MSDTC,這將導致寫入不同edmx中的多個表?再一次,底層數據庫是一樣的,我不想在這種情況下使用MSDTC。

有沒有辦法通過活動事務傳遞打開的SQL連接?

感謝您的幫助。

問候, 威廉

+0

您不一定需要在EF中完成* everything *。 –

回答

2

TransactionScope徵募MSDTC當數據庫是不同的和/或所述連接字符串是不同的。

對此,Rick Strahl有一個great article(他的觀點是LINQ to SQL,但它適用於EF)。錢段落:

的TransactionScope是一個高層次的事務包裝,使得它真正 易於包裝任何代碼到一個事務中,而無需手動跟蹤 交易。傳統上,TransactionScope是分佈式事務處理協調器(Distributed Transaction Coordinator,DTC)的.NET 包裝,但它的功能有所擴展。一個問題是,DTC在資源使用方面相當昂貴,並且它要求DTC服務實際上在機器上運行(另一種服務 ,這在客戶機安裝中特別麻煩),所以DTC是 。

然而,最近更新的TransactionScope和SQL Server客戶端 司機有可能使用TransactionScope類和便於 使用它提供的,而不需要DTC只要您運行 針對單個數據庫,並用單一致連接 字符串。在上面的例子中,由於事務與DataContext的單個實例一起工作,事務實際上在不涉及DTC的情況下工作 。這是在SQL Server 2008.

另請參閱此SO question/answer我在哪裏找到鏈接到裏克的博客。

因此,如果您連接到同一個數據庫並且使用相同的連接字符串,則不應涉及DTC。

0

感謝上面的所有答覆!

順便說一句,只是設法找到一個明確使用EntityConnection和EntityTransaction的解決方案。樣本是這樣的:

string theSqlConnStr = "data source=TheSource;initial catalog=TheCatalog;persist security info=True;user id=TheUserId;password=ThePassword"; 

    EntityConnectionStringBuilder theEntyConnectionBuilder = new EntityConnectionStringBuilder(); 
    theEntyConnectionBuilder.Provider = "System.Data.SqlClient"; 
    theEntyConnectionBuilder.ProviderConnectionString = theConnectionString; 
    theEntyConnectionBuilder.Metadata = @"res://*/"; 

    using (EntityConnection theConnection = new EntityConnection(theEntyConnectionBuilder.ToString())) 
    { 
     theConnection.Open(); 
     theET = null; 

     try 
     { 
      theET = theConnection.BeginTransaction(); 

      DataEntities1 DE1 = new DataEntities1(theConnection); 
      //DE1 do somethings... 

      DataEntities2 DE2 = new DataEntities2(theConnection); 
      //DE2 do somethings... 

      DataEntities3 DE3 = new DataEntities3(theConnection); 
      //DE3 do somethings... 

      theET.Commit(); 
     } 
     catch (Exception ex) 
     { 
      if (theET != null) { theET.Rollback(); } 
     } 
     finally 
     { 
      theConnection.Close(); 
     } 
    } 

有明確的使用EntityConnection & EntityTransaction的,我可實現單連接和事務多ObjectContexts單個數據庫的共享,但無需承擔MSDTC的使用。

希望此信息是有幫助的。釓運氣!

相關問題