В нашей базе данных есть таблица аудита, и при обновлении старые и новые значения сериализуются в 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?