Интерфейс 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.