2016-03-03 20 views
1

我工作的一個C#項目,的EntityFramework最後開發商寫道:的EntityFramework,並TransactionScope的SaveChange

using (System.Transactions.TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted })) 
{ 
    try 
    { 
     //... do somehting 
     context.SaveChanges(); 

     //... do some other work 
     context.SaveChanges(); 

     scope.Complete(); 
    } 
    catch (Exception ex) 
    { 
     context.RollbackChanges(); 
     scope.Complete(); 
    } 
} 

他爲什麼使用TransactionScope我不明白。我試圖在2 SaveChanges回滾第一次調用修改之間拋出異常。

爲什麼使用TransactionScope

感謝

回答

2

這應該解釋爲你 - https://blogs.msdn.microsoft.com/alexj/2009/01/11/savechangesfalse/

編輯:按szer的要求。

他們關鍵外賣從鏈接:

「如果你調用的SaveChanges()或調用SaveChanges(真),EF簡單地假設,如果它的工作完成好,一切都沒有問題,所以它會丟棄它一直在跟蹤的變化,並等待新的變化。「

3

您需要調用作用域對象上的Rollback()方法。要創建範圍,撥打context.Database.BeginTransaction()

using (var scope = context.Database.BeginTransaction()) 
{ 
    try 
    { 
     // do some stuff 
     context.SaveChanges(); 

     // do other stuff 
     context.SaveChanges(); 

     scope.Commit(); 
    } 
    catch (Exception) 
    { 
     scope.Rollback(); 
    } 
} 
+0

爲什麼在新的TransactionScope上使用BeginTransaction?那指定的isolationLevel呢? – Neb

2

像馬克解釋你需要回滾TransactionScope,不是EF方面的事務。 TransactionScope創建一個環境事務,操作可以參與進來。所以你在這裏做的是創建一個包裝多個事務的事務,並且可以一次提交或者回滾所有事務。

發生了什麼事在你的代碼是這樣的:

  1. 您提交查詢1(與調用SaveChanges調用)。
  2. 您正在提交查詢2(使用SaveChanges調用)。
  3. 發生錯誤。
  4. 您正在回滾最新的交易(查詢2)。請注意,查詢1仍然提交。
  5. 你正在提交環境事務,'保存'結果。這意味着最終結果是查詢1已提交併且查詢2已回滾。