Метод CopyTo()
Чтобы получить отдельную инстанцию объекта данных, можно использовать метод CopyTo
, объявленный в DataObject.
CreateDataObjectsCopy = true
Этот флаг включает копирование связанных объектов (детейлов и мастеров).
Причём мастера копируются именно как объекты, а не просто ставится ссылка на них.
- Если копируется объект, у которого есть детейлы, то для них тоже будет создана копия.
- Если копируется объект-детейл, то будет создана полная копия и для его агрегатора (соответственно со всеми его детейлами).
PrimaryKeyCopy
Управляет копированием первичных ключей (действует на свой ключ, ключи мастеров и ключи детейловых объектов).
true
: первичные ключи будут взяты из исходного объектаfalse
: первичные ключи будут заново сгенерированы
Копия объектов данных
Ещё одной важной особенностью этого метода является то, что копируется и ссылка на копию данных (будет один объект копии данных на 2 инстанции объекта данных). Причём флаг PrimaryKeyCopy
на это никак не влияет - в копии данных останется тот первичный ключ, который был до копирования.
Не гарантируется адекватное состояние копии данных после вызова метода CopyTo
. Следует использовать методы InitDataCopy
или clearDataCopy
после вызова CopyTo
.
Контекстно-зависимый кэш объектов данных (DataObjectCache)
Копирование происходит с применением кэша объектов данных. Это означает, что при повторном обращении к объекту, проверяется его наличие в кэше (по ключу “тип + первичный-ключ объекта”) и только после этого происходит либо создание, либо используется уже созданный, найденный в кэше.
Если стоит задача скопировать объект данных один в один без использования кэша (например, если 2 мастера одного типа с одним ключом были загружены с разными наборами данных и нужно предотвратить повсеместное использование первого из них), то рекомендуется применять метод CopyToObjectWithoutCache
.