データベースに監査テーブルがあり、更新時に古い値と新しい値が 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に戻ります。理想的ではありません。
したがって、代わりにメンバーごとのクローンを作成したいと思います。メンバーごとのクローンはオブジェクト参照を除外し、関連するすべての 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 の浅いコピーを作成するにはどうすればよいでしょうか?