实体记录的深度拷贝
本文关键字:拷贝 深度 记录 实体 | 更新日期: 2023-09-27 17:51:00
我试图有一个实体记录的深度拷贝,以便我可以在以后的时间比较它。
我已经尝试了多个深度复制代码,但他们正在产生这个错误。
var oldAddress = DeepClone(_entity.Addresses.Where(x => x.Id ==
addressDTO.Id).FirstOrDefault());
"System.Data.Entity.DynamicProxies.....is not marked as serializable."
使用 代码
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);
}
}
编译器告诉你这段代码不能工作。实体中有一些动态代理,这些代理不能被序列化。
你的DeepClone函数正在使用序列化和反序列化来克隆对象-并且你不能序列化这些代理。
我没有尝试克隆实体框架对象,所以我不知道这是否会工作-但与NHibernate你可以访问嵌套的对象和那些代理对象被替换为实际对象。所以这可能行得通。但是它很粗糙。
一个更好的解决方案是创建一个没有实体框架的对象,并将需要的数据复制到这些对象中。有一些解决方案可以轻松地将数据从实体框架对象复制到普通对象。
我使用胶水对此(https://glue.codeplex.com/)。
另一个解决方案是Automapper (https://github.com/AutoMapper/AutoMapper)
这些新创建的对象可以很容易地序列化、存储、比较和克隆。
禁用创建代理。你还需要加上这个:
bf.Context = new StreamingContext(StreamingContextStates.Clone);