【发布时间】:2012-02-19 06:19:25
【问题描述】:
我找到了这个sn-p 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();
它可以工作,但仍然没有复制任何嵌套\相关的记录。我在这里做错了什么?
我有这个结构 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 行获取异常:
ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法跟踪具有相同的多个对象 键。
【问题讨论】:
-
您确定它们在原始对象中不为空吗?
-
@JamesD'Angelo,是的,你是对的,如果查看调试,参考表是空的:(。为什么会发生这种情况?这就是我检索原始对象的方式:Entity original = db。 Entities.Where(l=>l.ID == myId).Single();
-
您可以发布您实体的代码吗?
-
这是一种令人讨厌的深度复制方式...不是很高效...
-
@FelixK.,有什么好办法?
标签: c# entity-framework .net-4.0