使用EF跟踪特定时间点的变化

时间:2011-08-11 07:09:52

标签: .net entity-framework-4

实体的EntityState属性跟踪EF实体的状态,从添加到DBContext的时间点开始。

如果我想跟踪其他时间点的更改,该怎么办?

要求这样的情况是: 在编辑表单上,我试图在退出时警告用户如果修改了实体。这对于现有实体来说不是什么大问题,因为在更改某些内容时它们被标记为已修改。但对于新实体,EntityState始终是“已添加”,因此我无法跟踪是否有任何更改。

在创建新实体时,我运行了一些初始化代码。如果新实体是创建,初始化但未被用户修改,则无需警告用户。所以我想在init代码运行后启动更改跟踪。不用说,DBUpdates应该像以前一样工作。

我该怎么做?

注意:我想出了一些可能的解决方案。首先是保留实体的原始副本,并在需要时通过字段比较进行字段。另一个是自己保留一个“修改过的”变量,并将许多事件处理程序写入编辑器控件以进行更新。 两者都很昂贵,难以维护,不被认为是一种选择。

2 个答案:

答案 0 :(得分:0)

你必须自己编码。无法停止对附加实体的更改跟踪或仅还原所选更改。如果用户确认更改,您必须手动复制实体并手动同步更改。

  

两者都很昂贵,难以维护,不被认为是一种选择。

如果只修改单个实体(不是它的关系),EF将为您提供应用新值的单一方法(DbContext API):

context.Entry(attachedEntity).CurrentValues.SetValues(modifiedClone);

如果您修改实体图(更多相关实体),您必须手动执行此操作。

编辑:

对于带有ObjectContext API的EFv4,它是相同的,你可以使用这个帮助器:

context.YourEntitySet.ApplyCurrentValues(modifiedClone);

答案 1 :(得分:0)

我最终通过自己跟踪“修改”变量并在任何变化时将其设置为真来完成 诀窍是,我正在使用实体的PropertyChanged事件,所以我不必为编辑器控件编写单独的事件处理程序。此外,我在初始化实体后附加了事件处理程序,因此忽略了我所做的初始更改,但只跟踪了用户的更改。