2017-02-20 46 views
2

如果在保存時有任何異常,下面的代碼是否會回滾更改?EntityFramework Transaction - 保存到多個表

using (SampleEntities context = new SampleEntities()) 
{ 
    //Code Omitted 

    context.EmpPercAdjustments.AddRange(pp); 
    context.SampleJobs.AddRange(sampleJobs); 

    context.SaveChanges(); 
} 

或者

我需要使用事務?

using (SampleEntities context = new SampleEntities()) 
{ 
    //Code Omitted 

    using (System.Data.Entity.DbContextTransaction tranc = context.Database.BeginTransaction()) 
    { 
     try 
     { 
      context.EmpPercAdjustments.AddRange(pp); 
      context.SampleJobs.AddRange(sampleJobs); 
      context.SaveChanges(); 
      tranc.Commit(); 
     } 
     catch (Exception ee) 
     { 
      tranc.Rollback(); 
     } 
    } 
} 

使用其他的優點嗎?

+0

你試過了嗎? –

+0

@CallumLinington是的,我試過了。看起來像兩個代碼回滾,如果有任何異常。 – ElectricRouge

+0

@CallumLinington如果第一個表中的數據成功保存並且在第一個示例中保存到第二個表時發生異常,該怎麼辦?我如何測試這種情況? – ElectricRouge

回答

3

是的,它會正確回滾。

在這種情況下,您不需要運行顯式事務,因爲實體框架已經創建了一個事務。

如果你想f.e.通過調用context.Database.BeginTransaction()創建一個事務是很好的。得到的Id剛插入的記錄,東西是這樣的:

using (SampleEntities context = new SampleEntities()) 
{ 
    using (System.Data.Entity.DbContextTransaction trans = context.Database.BeginTransaction()) 
    { 
     context.SampleJobs.Add(newJob); 
     context.SaveChanges(); 
     var jobId = newJob.Id; 
     //do other things, then commit or rollback 
     trans.Commit(); 
    } 
} 

在這種情況下,調用SaveChanges()後,在​​所做的更改應用(在你的範圍,所以你可以讀取數據庫生成添加對象的編號) ,但他們仍然必須承諾或回滾,因爲更改只有dirty written

如果您有多個方法可以修改上下文對象,但是您希望有最終決定權,如果他們所做的更改都將全部提交,那麼定義顯式事務也很有用。

+0

雖然用戶必須提交或回滾您的評論'//做其他事情...',但我會非常清楚。不遵守規定的交易是危險的,因爲它們可能會在以後帶來意想不到的後果。假如你有一個骯髒的保存,然後幾秒鐘後其他人做回滾,你有可能回滾你的價值。或者你可以在另一個提交中包裝它,這可能不會影響任何負面的東西,但有可能會發生恢復中的奇怪事情。 – djangojazz

+1

是的,您應該始終提交或回滾此類事務。但是如果你不這樣做,那麼在銷燬沒有被提交的反轉對象時將會調用回滾(這將在離開'使用'塊之後執行) – tomassino

+0

有趣我以前從來沒有這樣做,我將不得不稍後再檢查一下測試代碼並確認。 – djangojazz