2012-08-07 58 views
3

有幾種方法撤消在實體框架的變化:實體框架撤消更改對象的引用

  • 重新創建對象上下文
  • 分離/從上下文中附上
  • 刷新:上下文.MyEntity.Context.Refresh(RefreshMode.StoreWins,myobject);

該應用程序具有選項卡式界面,其中一個選項卡顯示不同的實體對象。用戶可以將標籤添加到對象(m:n關係)。我嘗試了所有我能找到的東西,我無法讓Entity Framework撤消用戶對m:n關係所做的更改。 例如,用戶添加一個標籤(m:n對象被創建)。如果用戶單擊「取消」,則該對象應保存到數據庫中。

重新創建上下文可能會導致其他選項卡中的數據丟失。 分離/附加和刷新()僅在對象本身發生更改時才起作用,並且沒有相關對象在對象的列表中添加/刪除。

我想過爲每個選項卡使用不同的上下文對象,但這會導致數據不同步(例如,用戶單擊列表並打開新選項卡。更改對象後,列表將不會不會自動更新)

回答

2

EF中沒有撤消更改。您當前的問題更多的是關於您的應用程序如何工作以及EF如何工作的方式。預計EF將作爲工作單位工作 - 您做出了很多改變,並將其保存在一起或將它們一起扔掉。

您的應用程序顯然需要不同的模型,因爲您只需要恢復部分更改。這不完全是EF的背景下應該處理的。這種邏輯應該與EF分開處理=您的gui應該處理不與上下文相關的對象,並且只應在用戶決定保存結果時附加實體並定義更改。

上下文中的部分撤消操作需要您瀏覽ObjectStateManager中的條目並恢復創建的更改。對於改變的多對多關係,你將不得不找到代表關係的狀態條目並恢復狀態改變。這些條目只能在添加,刪除或不變的狀態下使用。您可以將刪除的內容移回原來的位置,但我現在不確定您是否可以以某種方式分離或移除添加的實例。

+0

我認爲你是對的。我嘗試撤消的「工作單元」對於EF來說太複雜了。我改變了應用程序,爲每個新標籤使用不同的上下文。所以我現在唯一需要解決的就是如何刷新父列表。但多數民衆贊成在WPF的事情... – fnx 2012-08-09 17:55:19