2017-04-20 120 views
3

我正在尋找回滾實體更改的方法。我遇到了this answer,它顯示瞭如何設置實體狀態,但我想知道如果我簡單地處理我的dbContext實例而不調用dbContext.SaveChanges()或操縱實體狀態會發生什麼。如果我調用DbContext.Dispose而不調用DbContext.SaveChanges會怎麼樣?

我寫的這樣做的代碼絕對有效,但我是否會因爲拒絕以這種方式進行更改而讓任何事情處於不穩定狀態?

回答

3

如果我只是不調用dbContext.SaveChanges處置我的DbContext實例會發生什麼()或操縱實體狀態

沒有。先前連接到現在配置的DbContext實例的實例將繼續存在,因爲任何常規實例都會假設這些實例在某處被某種東西處理。如果沒有內存將被釋放,並最終垃圾收集爲任何其他正常的事情,如果沒有處理它。內存中的實體狀態保持不變,內存中的任何內容都不會自動恢復。數據庫存儲也保持「原樣」,這意味着不存在從DbContext到數據存儲區的調用。

我是留下任何處於不穩定的狀態,通過拒絕改變這樣

沒有,至少在數據存儲中。在內存中很難說,它取決於代碼的遺漏位置以及依賴關係對修改的依賴。讓我們假設它是一個無狀態的asp.net應用程序,也許請求只是結束,在這種情況下,下面的任何請求都不應該不穩定,因爲它們應該從數據存儲中檢索需要的東西。

如果它的更長時間像Windows應用程序一樣生活,那麼您可能必須手動確保先前正在跟蹤的實例的任何指針/句柄要麼使用現在恢復的內存狀態進行更新,要麼釋放這些指針。

就任何新的DbContext實例而言,它們都是相互獨立運行的,所以它們之間沒有延續。新的DbContext不知道被跟蹤的狀態或其他任何DbContext實例所跟蹤的狀態。

+1

這是實際解決我的問題的唯一答案。它不是解釋處置是如何工作的,而是關注DbContext本身內的實體。無論如何,你說的是有道理的。上下文中的實體將像任何其他對象一樣,只要沒有引用它們就會被GC'd存在。如果我不調用'.SaveChanges()',則更改不會被推送到數據庫。我很可能會很快將其標記爲答案 – oscilatingcretin

3

調用Dispose()類實現IDisposable的方法意味着你告訴圖書館「我已經完成了這個對象,我將不再使用它,你可以根據需要清理。」這不是特定於實體框架。

對於大多數類而言,嘗試在調用Dispose()後繼續使用該對象將會失敗,有時會有明確的異常提醒您該問題,有時會由於受損對象狀態導致內部異常。您不應該假設實體框架是一個例外:在調用dbContext.Dispose()之後,您不應再使用dbContext所引用的上下文。

然而,沒有什麼從創建一個新背景隨即停止你:

dbContext.Dispose(); 
dbContext = new DbContext(); 

這種新形勢下絕對不會有你的舊背景下所做的任何未保存的更改回憶。有很多這種方法最實用的好例子。

0

沒有什麼會處於不穩定的狀態,所以不用擔心。如果您在處置後嘗試調用上下文,您將獲得ObjectDisposedException,否則如果您不再需要它,則處置它是合法的。

相關問題