撤消实体框架中的更改,包括更改为对象引用

时间:2012-08-07 09:39:58

标签: entity-framework

有几种方法可以撤消实体框架中的更改:

  • 重新创建对象上下文
  • 从上下文分离/附加
  • 刷新:context.MyEntity.Context.Refresh(RefreshMode.StoreWins,myobject);

应用程序有一个选项卡式界面,其中一个选项卡显示不同的实体对象。用户可以向对象添加标签(m:n关系)。我尝试了所有我能找到的东西,我无法获得用户对m:n关系所做的实体框架撤消更改。 例如,用户添加标签(创建m:n对象)。如果用户单击“取消”,则应将对象保存到数据库中。

重新创建上下文可能会导致其他标签中的数据丢失。 Detach / Attach和Refresh()仅在对象本身已更改且没有从对象的列表中添加/删除的相关对象时起作用。

我考虑过为每个标签使用不同的上下文对象,但这会导致数据不同步(例如,用户点击列表并打开一个新标签页。更改对象后,列表就不会出现' t自动更新)

1 个答案:

答案 0 :(得分:2)

EF中没有撤消更改。您当前的问题更多地取决于您的应用程序的工作方式以及预期EF的工作方式。预计EF将作为工作单元工作 - 您进行了大量更改,并将它们保存在一起或将它们放在一起。

您的应用程序显然需要不同的模型,因为您只需要还原部分更改。这并不是EF的上下文应该处理的。这样的逻辑应该与EF分开处理=你的gui应该使用没有附加到上下文的对象,你应该附加实体并仅在用户决定保存结果时定义更改。

上下文中的部分撤消要求您浏览ObjectStateManager中的条目并还原已创建的更改。对于更改的多对多关系,您必须找到表示关系的状态条目并恢复状态更改。这些条目只能处于添加,删除或未更改状态。您可以将已删除的内容移回到未更改但我目前不确定您是否可以以某种方式分离或删除添加的实例。