Статусы объектов данных
Статусы объектов данных могут быть:
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 |