【问题标题】:Self tracking entity with "check points"具有“检查点”的自我跟踪实体
【发布时间】:2011-08-30 02:50:38
【问题描述】:

我正在开发 WPF 4/Entity Framework 4(自我跟踪实体)应用程序。作为概念验证,我正在创建一个绑定到 EF 实体的相当简单的 UI。

我们的用户希望能够编辑实体,但可以选择接受或拒绝几组更改而不保存到数据库,直到他们准备好之后。例如,用户可以对实体进行一组修改,然后“接受更改”(但不保存)。用户进行的下一组修改可能会被“拒绝”。在这种情况下,实体将恢复到上次接受更改时的状态。然后,用户可以对实体进行更多修改,但这一次,保存到数据库中。第二组修改将不被包括在内,因为它们被拒绝了......

我正在考虑使用 OriginalValues 集合,但顾名思义,它只为每个字段提供原始值。我确信我可以编写一些自定义代码来在接受更改时清除 OriginalValues 集合,然后在更改被拒绝时恢复为 OriginalValues。

此时我只是在集思广益。有没有人做过这样的事情?有什么好的例子吗?

非常感谢!

【问题讨论】:

    标签: .net entity-framework c#-4.0 entity-framework-4 self-tracking-entities


    【解决方案1】:

    STE 不支持此功能,但它们只是模板,因此您可以实现任何您想要的附加逻辑。除非您打算重新实现 STE,否则您应该使用基于 GoF Memento pattern 的非常简单的方法。一旦用户接受更改,就会创建实体的深层克隆(序列化后反序列化将进行深层复制)并将其存储在内存中的某个位置。如果用户拒绝更改,只需丢弃当前实体并选择存储的克隆。默认情况下,STE 应该可以使用DataContractSerializer 进行序列化。

    【讨论】:

    【解决方案2】:

    我以同样的方式使用 EF 4 STE。我想出的一种解决方案是在 T4 模板中重用 ChangeTracker。您需要第二个更改跟踪器实例来跟踪“会话”更改。然后,在每个会话中,您需要新建会话更改跟踪器实例,并在每个会话结束时将它们丢弃。这可以通过不将 SessionChangeTracker 属性标记为 DataMember 来完成,并且在图表中每个对象的反序列化/创建时,您需要实例化 SessionChangeTracker。

    【讨论】:

    • 感谢您的回复!我认为 ChangeTracker 方法适用于某些应用程序。我也很想尝试 T4 模板。
    【解决方案3】:

    另一种解决方案是使用 T4 和属性名称/值字典扩展具有“IsModified”属性的实体。

    您必须编写一个方法来获取图中所有被修改的实体,然后相应地处理修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多