自我跟踪实体设置和比较更改

时间:2011-01-18 00:12:49

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

我正在将.net应用程序作为我的Univeristy项目,我遇到了自我跟踪实体集的问题。我正在选择一条记录,将其传递给wcf服务,进行一些更改并再次将其传递给服务器。在那里我想比较改变的内容,所以我再次从上下文中选择相同的记录(这是具有旧值的记录)并进行比较。然后,在比较之后我想在上下文中调用ApplyChanges与通过服务传递的实体,并且我得到一个错误:

  

AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。在调用AcceptChanges之前,请确保键值是唯一的。

我想这是因为加载相同的实体两次(在更改之前和更改之后进行比较)。有没有更好的方法来比较更改(我需要在另一个db表中更改历史记录)?如果两个客户端获得相同的记录,并且第一个更改它并希望存储到数据库中,那么这个错误也不会出现问题吗?我正在使用.net 4.0。

1 个答案:

答案 0 :(得分:0)

这不是使用STE的方法。 STE包含了很多逻辑,但它们无法处理duplicate keys attached to context

所以我可以想象两个解决方案:

  • 不要加载实体来比较更改。而是应用STE中的更改并处理SavingChanges事件(或覆盖上下文中的SaveChanges)以从ObjectStateManager获取应用的更改。
  • 在应用STE的更改之前,尝试加载detach实体。