我们的数据库中有一个审计表,更新时新旧值被序列化为 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;
}
虽然这可行,但由于从深度克隆中提取的相关记录,它会生成大量数据,从数据库中读取数十万次,dcSer.WriteObject(memoryStream, obj)
最终 MemoryStream 大小约为 200MB,更不用说正在写入的数据量回到数据库。不理想。
所以我想做一个成员克隆,因为我的理解是成员克隆会将对象引用排除在外,并避免复制所有相关的实体框架模型。
所以我这样做了:
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 的浅表副本?