.net - 如何深度克隆实体并避免由导航属性引起的错误?

标签 .net entity-framework clone deep-copy

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

"An object with the same key already exists in the ObjectStateManager"

背景:

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

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

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

因为我真正需要的是深拷贝,所以我尝试实现了所示的序列化克隆技术 here , herehere .我的调用代码如下所示:

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/

相关文章:

c# - 搭建新表并保留现有表?

java - 获取SerializationService,通过序列化进行克隆

git - 在 Github 的流量选项卡中解释克隆信息

git - 克隆 git 存储库的偷偷摸摸的方法?

entity-framework - Entity Framework 多对多实体?

.net - SSD 驱动器上奇怪的目录删除行为

.net - asp.net 中 URL 开头的 ~ 到底有什么作用?

c# - 我可以使用 C# 自动化 SoapUI 吗?

entity-framework - .net core - WebApp 和 EF 数据层的分离不起作用

c# - 在 .NET 中如何使用属性初始化 FormCollection?