自跟踪实体 - AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突

entity-framework objectcontext self-tracking-entities wcf

我已经被这个问题困住了一个多星期了。希望有人能指出我正确的方向。

我首先简要介绍一下我的架构。

资产1 ---> 1地址* - > 1区* - > 1区* - > 1国家

套餐1 - > *资产

使用自我跟踪实体(STE)+ WCF。

脚步:

  1. 调用数据存储以获取资产列表。
  2. 调用数据存储以获取包列表。
  3. 用户选择一个包并为其分配一些资产。
  4. 保存包裹。

在步骤2中,呼叫使用预先加载的地址。

from p in context.Assets.Include("Address.Area.Region.Country")

这是尝试呼叫时的错误

context.Packages.ApplyChanges(package)

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

编辑

在窥探之后,我发现这是一个STE问题。问题是您无法持久存储包含此处概述的同一实体的多个实例的图形。这是我的问题。

如何将实体添加到我的实体集合中。新实体可能具有包含与集合中已有密钥相同的密钥的相关实体。即添加可能包含相同地址,区域,地区或国家/地区实体的新资产。

这是我的约束:

  1. 我必须使用导航集合,因为它会影响UI。
  2. 我无法预先获取将涉及的所有实体,因为数据集太大了。
  3. 我必须能够随时拍摄实体的快照以保留历史记录并使用它来“撤消”任何更改。

我知道Diego B Vega建议的可能解决方案,但这些不是我可以用于我的解决方案的选项。有没有人有任何其他想法?

一般承认的答案

仅供参考,我写了一篇博文,对我在EF论坛中已经回复的内容提出了一些额外的建议。 是博客文章。


热门答案

如果你知道我的意思,你有没有考虑放弃ORM-s并恢复正常访问:-)

不开玩笑 - 当你像一个问题(比起其他任何东西闻起来像ORM臭虫)那样摔跤时你可以推出自己的5-10函数来进行正常的sproc调用和更简单的数据类型转换然后你现在又回到完全控制状态,并且不会被图书馆所困扰,这些图书馆将会像5年一样稳定下来。

特别是因为你似乎有非常干净的架构 - 意味着非常简单的查询和直接的更新。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因