gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:24:25 25 4
gpt4 key购买 nike

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

"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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com