如何深入克隆实体并避免导航属性导致的错误?
我的实体上的导航属性导致我的深层克隆失败并显示错误:
“ObjectStateManager中已存在具有相同键的对象”
背景:
用户希望能够克隆父记录及其所有关联的子记录。 我能够使用这种简单的技术单独克隆父实体(没有错误):
_context.Detach(currentParentEntity);
_context.AddToParentEntities(currentParentEntity);
_context.SaveChanges();
我在这里找到了解决方案和另一种工作浅层克隆技术(来自diamandiev)。
由于我真正需要的是深层副本,我尝试实现此处和此处显示的序列化克隆技术。 我的调用代码如下所示:
ParentEntity clonedParentEntity = (ParentEntity)DeepClone(currentParentEntity);
_context.Detach(currentParentEntity);
clonedParentEntity.EntityKey = null;
_context.AddToParentEntities(clonedParentEntity);
_context.SaveChanges();
此代码仅适用于在没有子实体的情况下克隆currentParentEntity(在导航属性中引用)。 如果存在子实体,我会得到“具有相同密钥的对象已经存在”的错误。 为什么? 如何深入克隆父实体及其关联的子实体,然后保存克隆的记录而不会出现任何错误?
提前致谢。
编辑:完整的接受答案阅读Ladislav Mrnka的回答加上评论 。
如果你真的使用了序列化,你克隆了父实体和子实体 - 这不是你的问题。 你的问题是调用Detach
因为它只会删除你分离的单个实体(而不是它的子级)。 所以这个错误是由添加具有已经被上下文跟踪的相同密钥的孩子造成的。
上一篇: How can I deep clone an entity and avoid errors caused by navigation properties?