C# 实体记录的深度副本
我正在尝试一个实体记录的深度副本,以便以后可以比较它 我尝试了多个DeepCopy代码,但它们产生了此错误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
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);