Описание и особенности генерации и состояние загрузки объектов данных

Статусы объектов данных

Статусы объектов данных могут быть:

  • ObjectStatus.UnAltered — объект данных не изменён.
  • ObjectStatus.Created — объект данных создан.
  • ObjectStatus.Altered — объект данных изменён.
  • ObjectStatus.Deleted — объект данных удалён.

Статус объекта можно выяснить методом объекта данных GetStatus, а установить — SetStatus. Статус позволяет выяснить, какие именно изменения были внесены в объект данных.

AutoAltered

Статус Altered может вычисляться автоматически в момент вызова метода GetStatus. Для этого необходимо классу объекта данных приписать атрибут AutoAltered. Если этот атрибут не приписан, то установку статуса Altered программист должен выполнять «вручную». Следует внимательно пользоваться данной возможностью, помнить, что установка AutoAltered замедляет работу, поскольку при каждом получении статуса происходит реальная проверка свойств объекта данных на изменение. По-умолчанию AutoAltered=True;

Существует возможность не перевычислять статус при установленном AutoAltered, для этого необходимо вызывать метод GetStatus(false).

Проверить, установлен ли атрибут AutoAltered, можно методом Information.AutoAlteredClass.

Проверка на изменение свойств пользовательского типа

Если объект данных содержит свойства пользовательского типа (например, тип Деньги), то по-умолчанию сравнение значений такого атрибута самого объекта и его копии данных будет производиться через приведение этого атрибута к строке методом ToString(), а затем сравнением строк. Не для всех типов данный подход верен и работает быстро, поэтому существует интерфейс IComparableType, который содержит метод для сравнения. Если пользовательский тип унаследован от этого типа, то сравнение будет осуществляться не через строки, а вызовом специального метода, содержащегося в интерфейсе. Рекомендуется применять этот интерфейс для всех пользовательских типов атрибутов.

Состояния загрузки объекта данных

Состояние загрузки объекта данных:

  • LoadingState.NotLoaded — объект данных не загружен.
  • LoadingState.Loaded — вычитаны все собственные атрибуты объекта данных, все мастеровые первого уровня, все детейловые первого уровня.
  • LoadingState.LightLoaded — объект данных частично загружен, подробности могут быть выяснены вызовом у объекта методов GetLoadedProperties и CheckLoadedProperty.

Состояние загрузки можно выяснить через метод GetLoadingState, а установить — SetLoadingState.

Особенности отношений статуса и состояния загрузки

Ниже представлены некоторые особенности связи между статусами и состояниями загрузки объектов данных:

  • Когда объект данных создан, он всегда NotLoaded Created (то же самое происходит и при вызове метода Clear). Если объект NotLoaded, то он может быть только Created.
  • Если объект имеет состояние Loaded/LightLoaded, то он ни при каких условиях не может иметь статус Created.
  • Объект не бывает NotLoaded UnAltered.
  • Особым образом обрабатываются статус и состояние загрузки объекта при его обновлении.
  • Если нужно перевести объект из состояния Created в состояние Altered, то достаточно вызвать метод SetLoadingState(LoadingState.LightLoaded) тем самым указав, что объект в базе присутствует. Более правильный способ - это вызвать SetExistObjectPrimaryKey(object primaryKey) - это не только указывает на то, что объект в БД присутсвует, но и сразу задаёт правильный ключ этого самого объекта в базе.
  • Метод установки статуса объекту данных DataObject.SetStatus() имеет специальную логику, которая срабатывает при переключении статуса.
Устанавливаемое \ Старое UnAltered Created Altered Deleted
UnAltered UnAltered Created UnAltered Created если NotLoaded, иначе UnAltered
Created Created + NotLoaded Created + NotLoaded Created + NotLoaded Created + NotLoaded
Altered Altered Created Altered Created если NotLoaded, иначе Altered
Deleted Deleted Deleted Deleted Deleted