C# 实体记录的深度副本

C# 实体记录的深度副本,c#,C#,我正在尝试一个实体记录的深度副本,以便以后可以比较它 我尝试了多个DeepCopy代码,但它们产生了此错误 var oldAddress = DeepClone(_entity.Addresses.Where(x => x.Id == addressDTO.Id).FirstOrDefault()); "System.Data.Entity.DynamicProxies.....is not marked as serializable." 使用的代码 public static

我正在尝试一个实体记录的深度副本,以便以后可以比较它

我尝试了多个DeepCopy代码,但它们产生了此错误

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);
    }
}
public static T DeepClone(此T对象)
{
使用(var ms=new MemoryStream()){
var bf=新的二进制格式化程序();
bf.序列化(ms,obj);
ms.Position=0;
返回(T)bf.反序列化(ms);
}
}

编译器告诉您此代码无法运行。实体中有一些无法序列化的动态代理

您的DeepClone函数正在使用序列化和反序列化来克隆对象,而您无法序列化这些代理

我没有尝试克隆Entity framework对象,所以我不知道这是否可行——但是使用NHibernate,您可以访问嵌套对象,并且这些代理对象将替换为实际对象。所以这可能有效。但它是相当黑客

更好的解决方案是创建一个没有实体框架的对象,并将所需的数据复制到这些对象中。有一些解决方案可以轻松地将数据从实体框架对象复制到普通对象

我正在用胶水做这个()

另一个解决方案是Automapper()

这些新创建的对象可以很容易地序列化、存储、比较和克隆

禁用代理创建。 您还需要添加以下内容:

bf.Context = new StreamingContext(StreamingContextStates.Clone);