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>
如果一個模組丟失,會因為一個異常而造成全部重試,有意義嗎?