实体记录的深度拷贝

本文关键字:拷贝 深度 记录 实体 | 更新日期: 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);