Особенности каскадного удаления объектов c использованием Null

Интерфейс IReferencesNullDelete позволяет осуществлять каскадное удаление объектов (при удалении у всех ссылающихся объектов проставляется NULL вместо ссылки на удаляемый объект).

Как работает IReferencesNullDelete

Логика по занулению ссылок прописана в бизнес-сервере интерфейса IReferencesNullDelete; собственных свойств и методов данный интерфейс не предоставляет. Таким образом, чтобы вместе с некоторым объектом удалить все ссылки на него, достаточно, чтобы класс объекта был наследником от IReferencesNullDelete. Поиск классов, которые ссылаются на искомый, осуществляется следующим образом:

  • Определяется директория, где располагается сборка с классом, ссылки на который мы ищем.
  • В директории выбираются все сборки, имя которых заканчивается на «(Objects).dll».
  • В сборках ищутся типы, наследующие от DataObject.
  • В найденных типах определяются свойства, которые содержат ссылку на искомый класс или его прародителей.

Пример

Пусть есть диаграмма вида:

На диаграмму добавлен IReferencesNullDelete со стереотипом externalinterface , от которого наследуется класс Plant2 и Cabbage2. При удалении экземпляра этого класса будут удаляться также все ссылки на данный объект. При указанном расположении классов с учётом наследования:

  • При удалении экземпляра класса Plant2 будут проверяться ссылки среди экземпляров классов Salad2 и Dish2.
  • При удалении экземпляра класса Cabbage2 будут проверяться ссылки среди экземпляров классов Salad2, Dish2, CabbageSalad, Soup2 (экземпляры класса CabbagePart2 являются детейлами и будут удаляться).
  • Если удаляемый объект будет стоять, например, в экземпляре класса Salad2 в свойстве Ingridient2, то будет проброшено исключение, поскольку у данного свойства стоит атрибут NotNull.