Методы копирования данных и их особенности

Метод CopyTo()

Чтобы получить отдельную инстанцию объекта данных, можно использовать метод CopyTo, объявленный в DataObject.

CreateDataObjectsCopy = true

Этот флаг включает копирование связанных объектов (детейлов и мастеров).

Причём мастера копируются именно как объекты, а не просто ставится ссылка на них.

  • Если копируется объект, у которого есть детейлы, то для них тоже будет создана копия.
  • Если копируется объект-детейл, то будет создана полная копия и для его агрегатора (соответственно со всеми его детейлами).

PrimaryKeyCopy

Управляет копированием первичных ключей (действует на свой ключ, ключи мастеров и ключи детейловых объектов).

  • true: первичные ключи будут взяты из исходного объекта
  • false: первичные ключи будут заново сгенерированы

Копия объектов данных

Ещё одной важной особенностью этого метода является то, что копируется и ссылка на копию данных (будет один объект копии данных на 2 инстанции объекта данных). Причём флаг PrimaryKeyCopy на это никак не влияет - в копии данных останется тот первичный ключ, который был до копирования.

Не гарантируется адекватное состояние копии данных после вызова метода CopyTo. Следует использовать методы InitDataCopy или clearDataCopy после вызова CopyTo .

Контекстно-зависимый кэш объектов данных (DataObjectCache)

Копирование происходит с применением кэша объектов данных. Это означает, что при повторном обращении к объекту, проверяется его наличие в кэше (по ключу “тип + первичный-ключ объекта”) и только после этого происходит либо создание, либо используется уже созданный, найденный в кэше.

Если стоит задача скопировать объект данных один в один без использования кэша (например, если 2 мастера одного типа с одним ключом были загружены с разными наборами данных и нужно предотвратить повсеместное использование первого из них), то рекомендуется применять метод CopyToObjectWithoutCache.