У нас есть таблица аудита в нашей базе данных, и при обновлении старые и новые значения сериализуются в 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 около 200 МБ, не говоря уже о количестве данных. записывается обратно в БД. Не идеально.
Поэтому я хотел бы вместо этого сделать клонирование по элементам, так как я понимаю, что клонирование по элементам оставит ссылки на объекты и избежит копирования всех связанных моделей 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?