0

我正在研究WPF 4/Entity Framework 4(自我跟蹤實體)應用程序。作爲概念證明,我創建了一個與EF實體綁定的非常簡單的UI。具有「檢查點」的自我跟蹤實體

我們的用戶希望能夠編輯實體,但可以選擇接受或拒絕多組更改,而不必保存到數據庫,直到稍後準備就緒時爲止。例如,用戶可以對實體進行一組修改,然後「接受更改」(但不保存)。用戶所做的下一組修改可能會被「拒絕」。在這種情況下,實體將恢復到最後一次接受更改時的狀態。然後用戶可以對實體進行更多的修改,但是這次保存到數據庫。第二組修改將不會被包括,因爲他們被拒絕...

我想使用OriginalValues集合,但顧名思義,它只提供每個字段的原始值。我確信我可以編寫一些自定義代碼來在接受更改時清除OriginalValues集合,然後在拒絕更改時恢復爲OriginalValues。

我只是在這裏集思廣益。有沒有人做過這樣的事情?有什麼好的例子嗎?

非常感謝!

回答

1

STE不支持這個,但它們只是模板,所以你可以實現任何你想要的附加邏輯。除非你打算讓STE​​大型重新實現,否則你應該使用基於GoF Memento pattern的非常簡單的方法。一旦用戶接受更改,就可以創建實體的深層克隆(序列化後接反序列化將生成深層副本)並將其存儲在內存中的某個位置。如果用戶拒絕更改,只需丟棄當前實體並選擇存儲的克隆。默認情況下,STE應該可序列化爲DataContractSerializer

+0

DataContractSerializer在我的情況下工作。我發現有一個重載的構造函數是有幫助的:http://stackoverflow.com/questions/2417023/clone-whole-object-graph。謝謝。 –

0

我以同樣的方式使用EF 4 STE。我想出的一個解決方案是重用T4模板中的ChangeTracker。您需要第二個更改跟蹤器實例來跟蹤「會話」更改。然後,在每個會話中,您需要新建會話更改跟蹤器實例,並在每個會話結束時將其丟棄。這可以通過不將SessionChangeTracker屬性標記爲DataMember以及圖中每個對象的反序列化/創建來完成,您需要實例化SessionChangeTracker。

+0

感謝您的回覆!我認爲ChangeTracker方法適用於某些應用程序。我也很想嘗試T4模板。 –

0

另一種解決方案是使用T4和屬性名稱/值字典來擴展具有「IsModified」屬性的實體。

您必須編寫一個方法來獲取修改後的圖中的所有實體,然後相應地處理修改。