我有一個相當大的數據庫,其中包含爲不同業務模塊創建的表。如何在EF4中爲多個ObjectContexts實現單個SQL事務
我們決定分別爲不同的模塊創建不同的edmx文件。
但是,如何防止嘗試實現TransactionScope的邏輯操作時會使用MSDTC,這將導致寫入不同edmx中的多個表?再一次,底層數據庫是一樣的,我不想在這種情況下使用MSDTC。
有沒有辦法通過活動事務傳遞打開的SQL連接?
感謝您的幫助。
問候, 威廉
我有一個相當大的數據庫,其中包含爲不同業務模塊創建的表。如何在EF4中爲多個ObjectContexts實現單個SQL事務
我們決定分別爲不同的模塊創建不同的edmx文件。
但是,如何防止嘗試實現TransactionScope的邏輯操作時會使用MSDTC,這將導致寫入不同edmx中的多個表?再一次,底層數據庫是一樣的,我不想在這種情況下使用MSDTC。
有沒有辦法通過活動事務傳遞打開的SQL連接?
感謝您的幫助。
問候, 威廉
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。
感謝上面的所有答覆!
順便說一句,只是設法找到一個明確使用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的使用。
希望此信息是有幫助的。釓運氣!
您不一定需要在EF中完成* everything *。 –