我们的数据库中有一个审计表,在更新时,旧值和新值被序列化为XML并存储在同一行中。目前这些对象是进行深度克隆的:
public EntityObject CloneEntity(EntityObject obj)
{
DataContractSerializer dcSer = new DataContractSerializer(obj.GetType());
MemoryStream memoryStream = new MemoryStream();
dcSer.WriteObject(memoryStream, obj);
memoryStream.Position = 0;
EntityObject newObject = (EntityObject)dcSer.ReadObject(memoryStream);
return newObject;
}
虽然这样可以工作,但是由于从深度克隆中提取的相关记录需要读取数十万次DB,
dcSer.WriteObject(memoryStream, obj)
导致生成大量数据,最终的 MemoryStream 大小约为 200MB,更不用说写回到 DB 的数据量。不是理想的方案。因此,我想执行成员按需克隆(memberwise clone),因为我了解到它会将对象引用留出,并避免复制所有相关的 Entity Framework 模型。
所以我做了如下操作:
public EntityObject CloneEntity(EntityObject obj)
{
EntityObjectAuditable auditable = (EntityObjectAuditable)obj; // invalid cast exception
return auditable.ShallowCopy();
}
// ....
public class EntityObjectAuditable : EntityObject
{
public EntityObjectAuditable ShallowCopy()
{
return (EntityObjectAuditable)this.MemberwiseClone();
}
}
但是我遇到了一个无效的转换异常,因为传入的EntityObject
实际类型是与表本身相关的子类。
我还尝试使用扩展方法访问MemberwiseClone()
,但扩展方法无法访问受保护的方法。
那么,我如何创建一个通用的EntityObject的浅表副本呢?