如何深度克隆实体并避免导航属性导致的错误?

时间:2011-07-12 15:12:52

标签: .net entity-framework clone deep-copy

我的实体上的导航属性导致我的深度克隆失败并显示错误:

  

“ObjectStateManager中已存在具有相同键的对象”

背景:

用户希望能够克隆父记录及其所有关联的子记录。我可以使用这种简单的技术单独克隆父实体(没有错误):

_context.Detach(currentParentEntity);
_context.AddToParentEntities(currentParentEntity);
_context.SaveChanges();

我找到了解决方案和另一种浅层克隆技术(来自diamandiev)here

由于我真正需要的是深层拷贝,我尝试实现显示hereherehere的序列化克隆技术。我的调用代码如下所示:

ParentEntity clonedParentEntity = (ParentEntity)DeepClone(currentParentEntity);
_context.Detach(currentParentEntity);
clonedParentEntity.EntityKey = null;
_context.AddToParentEntities(clonedParentEntity);
_context.SaveChanges();

此代码仅在克隆没有子实体的currentParentEntity时使用(在导航属性中引用)。如果孩子存在,我得到“具有相同密钥的对象已存在”错误。为什么? 如何深度克隆父实体及其关联的子实体,然后保存克隆记录而不出现任何错误?

提前致谢。

编辑:对于完整接受的答案,请阅读Ladislav Mrnka的答案以及评论

1 个答案:

答案 0 :(得分:2)

如果你真的使用了序列化,你克隆了父实体和子实体 - 这不是你的问题。您的问题是调用Detach,因为它只会删除您正在分离的单个实体(而不是其子代)。因此,错误是由添加具有上下文已跟踪的相同键的子项引起的。