gpt4 book ai didi

c# - 如何深拷贝一个实体

转载 作者:可可西里 更新时间:2023-11-01 08:39:51 31 4
gpt4 key购买 nike

我找到了这段代码 here :

public static T DeepClone<T>(this T obj)
{
using (var ms = new MemoryStream()) {
var bf = new BinaryFormatter();
bf.Serialize(ms, obj);
ms.Position = 0;
return (T)bf.Deserialize(ms);
}
}

也就是说我们可以通过这个东西对所有相关对象进行深拷贝。

我正在尝试做这样的副本:

db.Detach(myEntity); 
myEntity.EntityKEy = null;
Entity newEntity = new Entity();
newEntity = DeepClone<Entity>(Entity);
db.Entities.AddObject(newEntity);
db.SaveChanges();

IT 有效,但仍未复制任何嵌套\相关记录。我在这里做错了什么?

我有这个结构 Entity->ChildEntity ->ChildChildEntity
-> - 一对多
所以我假设当我复制实体时它也会复制所有子记录。

更新:根据建议,我这样做了:

Entity newEntity = new Entity();
Eneity Entity = db.Include("ChildEntity").Where(p=>p.Id==Id).Single();
newEntity = DeepClone<Entity>(Entity);
db.Detach(myEntity);
myEntity.EntityKEy = null;
db.Entities.AddObject(newEntity);
db.SaveChanges();

在 AddObject 行获取异常:

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.

最佳答案

重要的一点是您必须加载相关实体并创建深度克隆在分离之前。如果您分离实体,所有关系都将被静默删除,因为 Detach 方法仅适用于单个实体,实体图不能同时包含附加实体和分离实体。这就是为什么您需要序列化而不是简单地调用 Detach 的原因。

不要忘记关闭延迟加载,否则您的序列化也会从数据库中提取其他导航属性的数据。另请记住,此深拷贝将创建图中所有实体的新版本,因此添加根实体也会添加所有相关实体。

关于c# - 如何深拷贝一个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9013325/

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