SaveChanges(false),savechangesfalse

來源:互聯網
上載者:User

SaveChanges(false),savechangesfalse

  這是做項目的時候遇到的一個問題,搜了半天,找到一篇英文部落格做了相關介紹,自己看了還是不太懂,以下是我對原文的一些翻譯,有不恰當之處請大家批評指正。

  很多時候EFEntity Framework可以為您管理事務。

  每次在你的.NET代碼中添加一個實體,刪除一個實體,修改一個實體,建立一個關係或者刪除一個關係。都通過EF來儲存,當你調用SaveChange()函數時,就會轉換成原生的SQL語句,並在資料庫中執行事務。

  一下這些情況你需要使用自己的事務:

  1.在同一個事務中,使用物件內容把一個訊息放到訊息佇列中。

  2.同時使用兩個物件內容。

  3.等等等等,你懂得……

  一旦出現更嚴重的錯誤,並且不在EF架構範圍內,你想要恢複的話就需要使用環境事務(TransactionScope)。

  如果你調用SaveChange()或者SaveChange(true),那麼EF就會直接的認為一切順利,然後就會放棄對於更改的追蹤,並等待新的更改。

  這樣的話一旦事務的其他地方出現錯誤,由於我們放棄了對於更改的追蹤,導致我們將不能夠再恢複。

  接下來介紹SaveChange(false)和AcceptAllChanges()。

  SaveChange(false)告訴EF必需執行的資料庫命令,但堅持更改(這裡我也不太理解原話是:but hold to the changes),所以如果有必要可以重載。現在如果整個事務失敗,你可以重試EF特定位,或者調用SaveChange(false)。再或者你可以通過狀態管理來記錄哪裡失敗了。

  一旦更多的事務執行成功,你只是直接調用AcceptAllChanges(),然後被追蹤的變化就會丟失。

  典型的虛擬碼如下:

  

<span style="font-family:KaiTi_GB2312;font-size:18px;">using (TransactionScope scope = new TransactionScope()) {     //Do something with context1     //Do something with context2     //Save Changes but don't discard yet     context1.SaveChanges(false);     //Save Changes but don't discard yet     context2.SaveChanges(false);     //if we get here things are looking good.     scope.Complete();     //If we get here it is save to accept all changes.     context1.AcceptAllChanges();     context2.AcceptAllChanges(); }</span>
  如果一個模組丟失,會因為一個異常而造成全部重試,有意義嗎?

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.