Интерфейс IReferencesNullDelete
позволяет осуществлять каскадное удаление объектов (при удалении у всех ссылающихся объектов проставляется NULL вместо ссылки на удаляемый объект).
Как работает IReferencesNullDelete
Логика по занулению ссылок прописана в бизнес-сервере интерфейса IReferencesNullDelete
; собственных свойств и методов данный интерфейс не предоставляет. Таким образом, чтобы вместе с некоторым объектом удалить все ссылки на него, достаточно, чтобы класс объекта был наследником от IReferencesNullDelete
.
Поиск классов, которые ссылаются на искомый, осуществляется следующим образом:
- Берутся сборки, заданные в свойстве
AssembliesForIReferencesCascadeDeleteSearch
классаICSSoft.STORMNET.Business.Interfaces.InterfaceBusinessServer
(задать можно с использованием методаSetupAdditionalAssemblies
; если список сборок не задан, то поиск осуществляется только в сборке класса, наследующего отIReferencesNullDelete
).
var assemblies = new[]
{
typeof(NewPlatform.Flexberry.ORM.Tests.Salad2).Assembly,
};
ICSSoft.STORMNET.Business.Interfaces.InterfaceBusinessServer.SetupAdditionalAssemblies(assemblies);
- В сборках ищутся типы, наследующие от DataObject.
- В найденных типах определяются свойства, которые содержат ссылку на искомый класс или его прародителей.
PropertyCouldnotBeNullException
и объект не будет удалён.Пример
Пусть есть диаграмма вида:
На диаграмму добавлен IReferencesNullDelete
со стереотипом externalinterface , от которого наследуется класс Plant2
и Cabbage2
. При удалении экземпляра этого класса будут удаляться также все ссылки на данный объект.
При указанном расположении классов с учётом наследования:
- При удалении экземпляра класса
Plant2
будут проверяться ссылки среди экземпляров классовSalad2
иDish2
. - При удалении экземпляра класса
Cabbage2
будут проверяться ссылки среди экземпляров классовSalad2
,Dish2
,CabbageSalad
,Soup2
(экземпляры классаCabbagePart2
являются детейлами и будут удаляться). - Если удаляемый объект будет стоять, например, в экземпляре класса
Salad2
в свойствеIngridient2
, то будет проброшено исключение, поскольку у данного свойства стоит атрибутNotNull
.