我的实体上的导航属性导致我的深度克隆失败并出现错误:
"An object with the same key already exists in the ObjectStateManager"
背景:
用户希望能够克隆父记录及其所有关联的子记录。我可以使用这种简单的技术单独克隆父实体(没有错误):
_context.Detach(currentParentEntity);
_context.AddToParentEntities(currentParentEntity);
_context.SaveChanges();
我找到了该解决方案和另一种可行的浅层克隆技术(来自 diamandiev)here .
因为我真正需要的是深拷贝,所以我尝试实现了所示的序列化克隆技术 here , here和 here .我的调用代码如下所示:
ParentEntity clonedParentEntity = (ParentEntity)DeepClone(currentParentEntity);
_context.Detach(currentParentEntity);
clonedParentEntity.EntityKey = null;
_context.AddToParentEntities(clonedParentEntity);
_context.SaveChanges();
此代码仅在克隆没有子实体(在导航属性中引用)的 currentParentEntity 时有效。如果存在子实体,我会收到“具有相同键的对象已经存在”错误。为什么? 我如何深度克隆父实体及其关联的子实体,然后保存克隆的记录而不会出现任何错误?
提前致谢。
编辑:要获得完整的已接受答案,请阅读 Ladislav Mrnka 的回答加上评论。
最佳答案
如果您真的使用了序列化,那么您克隆了父实体和子实体——这不是您的问题。您的问题是调用 Detach
因为它只会删除您正在分离的单个实体(不是它的子实体)。因此,错误是由于添加具有已被上下文跟踪的相同键的子项引起的。
关于.net - 如何深度克隆实体并避免由导航属性引起的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6666522/