0

将更改保存到自我跟踪实体时发生异常:

AcceptChanges cannot continue because the object's key values conflict with another object in the ObjectStateManager. Make sure that the key values are unique before calling AcceptChanges.

我相信该问题已在其他问题中得到解决,例如:自我跟踪实体 - AcceptChanges 无法继续,因为对象的键值与 ObjectStateManager 中的另一个对象冲突

我的问题是在开发和生产中调试此问题的最佳方法是什么。是否有任何可以捕获/访问的进一步信息,这些信息将详细说明导致异常的实体或实体类型。

如果不是,我是否必须编写一些东西来遍历对象图以查找引用不同对象的重复键?如果是这样,有人有这方面的经验吗?

更多信息:

我的场景涉及以下内容 - 客户端通过 WCF 服务检索一个实体,该服务包含更多实体的集合,所有这些实体都具有与其他实体的各种 FK。这些 FK 关系都包含在 linq 查询中,因此我们有一个完整的对象图。

客户端中的视图使用以前获取的静态数据实体,例如查找表以提高性能。如果我们对 User 说一个带有 FK 的 Customer 对象,它将在从服务中检索时加载。如果我们现在将另一个实体添加到对象图中,例如 Order 并在该对象上设置一个 User 属性,该属性与 Customer 对象中的 Id 相同,但该实体是在不同的点检索到的,因此使用不同的 ObjectContext(即对象具有相同的 ID 但不是对象的相同实例)我收到此错误。

指向另一个问题的链接演示了避免这种情况的方法,但我希望找到有关哪些实体导致问题的更多信息,以便我可以追踪错误。

4

2 回答 2

0

我一直在努力解决这个问题的时间比我愿意承认的要长。最后发现问题的原因是我听了 ReSharper 的提示让我的上下文提供者静态。由于发生了各种其他变化,因此我不认为将其视为罪魁祸首。但就我而言,这就是问题所在。

于 2014-09-02T21:40:27.287 回答
0

如果您尝试AcceptChanges使用之前用于加载实体的上下文,通常会发生这种情况 - 使用新的空上下文来接受更改。AcceptChanges当 STE 中的任何实体已经加载到上下文中时不能使用 - 这是当前 STE 实现的限制(但如果您重写模板,它可能会被删除)。

据我所知,这类问题没有详细的例外情况。对于调试 STE,请检查其生成的代码。您拥有完整的 STE 代码,因此您可以浏览更改跟踪器并搜索实体,但这并不容易。

我实际上不确定是否可以在客户端上定义重复项,但让我们假设它是。如果您可以控制客户端代码,最好的方法是诊断客户端代码。添加一些日志记录并找出重复的原因。然后删除重复项,因为在客户端上解决问题会比在服务上解决问题更容易。如果您无法控制客户端,我会说这是传递给客户端的数据不正确的问题,让客户端的开发人员修复它。

于 2011-06-17T08:33:16.033 回答