2010-11-02 64 views
1

大約一年前我使用EF。我只是嘗試使用TransactionScope處理相當複雜的查詢,如下面的代碼。爲什麼Entity Framework 4.0需要使用DTM?有沒有可能不使用它?

using (var tran = new TransactionScope()) 
{ 
    // Clear all data in some table 
    DataContext.SomeTables 
     .ForEach(x => DataContext.SomeTables.DeleteObject(x)); 

    DataContext.SaveChanges(); 

    // Import data from excel as DataSet object. 
    var ds = ImportDataFromExcel(file.FullName); 

    foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     DataContext.SomeTables.AddObject(new SomeTable 
     { 
      // fill object with data from current row. 
     }); 
    } 

    DataContext.SaveChanges(); 

    // Commit Transaction 
    tran.Complete(); 
} 

之後,我得到了一些有關DTM的錯誤未啓用或無法訪問。我知道它是由數據庫服務器上的此服務引起的,不是由防火牆啓動或阻止的。但這不是我的觀點。

我想知道爲什麼EF使用此服務創建事務,而普通的SQL腳本只能使用像「BEGIN TRAN」,「SAVE TRAN」或「ROLLBACK TRAN」這樣的語句。

有沒有其他方法可以避免爲我非常簡單的事務處理語句調用DTM服務?

PS。目前的工作數據庫非常小,我認爲它不應該受到不同交易技術的影響。

感謝,

回答

2

後,我查了很多網站,我發現我可以使用實體交易,如下面的源代碼手動創建的交易。

using (var tran = DataContext.BeginTransaction()) 
{ 
    // Clear all data in some table 
    DataContext.SomeTables 
     .ForEach(x => DataContext.SomeTables.DeleteObject(x)); 

    DataContext.SaveChanges(); 

    // Import data from excel as DataSet object. 
    var ds = ImportDataFromExcel(file.FullName); 

    foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     DataContext.SomeTables.AddObject(new SomeTable 
     { 
      // fill object with data from current row. 
     }); 
    } 

    DataContext.SaveChanges(); 

    // Commit Transaction 
    tran.Commit(); 
} 

Helper類

public static DbTransaction BeginTransaction(this ObjectContext context, IsolationLevel isolationLevel = IsolationLevel.ReadCommitted) 
{ 
    if (context.Connection.State != ConnectionState.Open) 
    { 
     context.Connection.Open(); 
    } 

    return context.Connection.BeginTransaction(isolationLevel); 
} 

感謝到Kim Major回答以下問題。我找不到任何其他頁面清楚地表明我使用實體交易,包括主要MSDN網站(How to: Manage Transactions in the Entity Framework)。

How to use transactions with the Entity Framework?

相關問題