我正在开发WPF 4 / Entity Framework 4(自我跟踪实体)应用程序。作为概念证明,我正在创建一个绑定到EF实体的相当简单的UI。
我们的用户希望能够编辑实体,但可以选择接受或拒绝多组更改,而不保存到数据库,直到它们准备好之后。例如,用户可以对实体进行一组修改,然后“接受更改”(但不保存)。用户进行的下一组修改可能会被“拒绝”。在这种情况下,实体将恢复到上次接受更改时的状态。然后,用户可以对实体进行更多修改,但这次保存到数据库。第二组修改将不包括在内,因为它们被拒绝了......
我正在考虑使用OriginalValues集合,但顾名思义,它只提供每个字段的原始值。我确信在接受更改时我可以编写一些自定义代码来清除OriginalValues集合,然后在更改被拒绝时恢复为OriginalValues。
我现在正在集思广益。有人做过这样的事吗?有没有好的例子?
非常感谢!
答案 0 :(得分:1)
STEs不支持这个,但它们只是模板,所以你可以实现你想要的任何其他逻辑。除非你要重新实现STEs,否则你应该使用基于GoF Memento pattern的非常简单的方法。一旦用户接受更改,就创建实体的深度克隆(序列化后反序列化将进行深层复制)并将其存储在内存中的某个位置。如果用户拒绝更改,则只丢弃当前实体并选择存储的克隆。默认情况下,STE应该使用DataContractSerializer
进行序列化。
答案 1 :(得分:0)
我以同样的方式使用EF 4 STE。我想出的一个解决方案是在T4模板中重用ChangeTracker。您需要第二个更改跟踪器实例来跟踪“会话”更改。然后,在每个会话中,您需要新建会话更改跟踪器实例,并在每个会话结束时将其丢弃。这可以通过不将SessionChangeTracker属性标记为DataMember来完成,并且对于图中每个对象的反序列化/创建,您将需要实例化SessionChangeTracker。
答案 2 :(得分:0)
另一个解决方案是使用T4和属性名称/值字典扩展具有“IsModified”属性的实体。
您必须编写一个方法来使图中的所有实体都被修改,然后相应地处理修改。