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

Tri*_*ran 12 wcf entity-framework self-tracking-entities objectcontext

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

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

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

套餐1 - >*资产

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

脚步:

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

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

from p in context.Assets.Include("Address.Area.Region.Country")
Run Code Online (Sandbox Code Playgroud)

这是尝试呼叫时的错误

context.Packages.ApplyChanges(package)
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

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

这是我的约束:

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

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

ZXX*_*ZXX 8

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

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

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


div*_*ega 8

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