English version

  1. Введение
  2. Persistent, Persistent
  3. NonPersistent, NonPersistent
  4. Persistent, NonPersistent
  5. Исходный код

Введение

Часть 1 смотрите http://xafari.ru/persistentnye-domennye-komponenty.html

В статье рассматриваются вопросы, связанные с особенностями реализации связей многие ко многим (Many-To-Many) между неперсистентными доменными компонентами (Domain Components), на примере использования Xafari x07.

Существует 3 комбинации связей с точки зрения персистентности:

  • Обе сущности персистентные (Persistent-Persistent)
  • Обе сущности неперситентные (NonPersistent-NonPersistent)
  • Одна сущность персистентная, вторая – неперсистентная (Persistent-NonPersistent)

Persistent, Persistent

Это стандартный вариант, его мы рассматривать не будем, поскольку этот случай подробно описан в документации по XAF

NonPersistent, NonPersistent

Ниже приведен пример данного случая.

NonPersistent, NonPersistent

В этом примере представлены две неперсистентные сущности ObjectM и ObjectN, которые связаны отношением N:M (Many-To-Many).

Можно рассмотреть три случая для отношения, которые предполагают различные способы решения.

  1. Типизированные персистентные коллекции.
  2. Не типизированные персистентные коллекции.
    1. Общая таблица хранения объектов связи.
    2. Отдельные таблицы хранения объектов связи.

Типизированные персистентные коллекции

Пример реализации через типизированные персистентные коллекции приведен ниже.

Типизированные персистентные коллекции

Эта реализация предполагает, что связь N:M между ObjectM и ObjectN преобразуется в связь между их наследниками PersistentObjectM и PersistentObjectN. Это является ограничением, поскольку в этом случае другие прямые наследники от ObjectM/ObjectN не могут быть добавлены в коллекции PersistentTermObjectNs/ PersistentTermObjectMs.

Пример реализации этого случая в коде:

Основная идея заключается в том, что связь ObjectN:ObjectM описывается с помощью вычисляемых свойств (TermObjectNs /TermObjectMs), а в персистентных наследниках добавляются персистентные коллекции (PersistentTermObjectNs /PersistentTermObjectMs), которые используются при вычислении TermObjectNs /TermObjectMs.

Xafari предлагает стандартный подход для описания этих вычисляемых полей через использование механизма терминов Xafari (Terms).

Не типизированные персистентные коллекции

Пример реализации через не типизированные персистентные коллекции приведен ниже.

Не типизированные персистентные коллекции

Эта реализация предполагает, что связь N:M между ObjectM и ObjectN реализуется через специальный промежуточный персистентный класс, который содержит не типизированные ссылки (weak reference) на персистентных наследников. В отличие от предыдущего варианта в этом случае в коллекцию могут быть добавлены любые наследники от ObjectM/ObjectN. Однако существуют ограничения в UI при редактировании этих коллекций.

Общая таблица хранения объектов связи

Пример реализации этого случая в коде:

Дополнительно необходимо обновить метаданные и добавить в модуль код, как показано ниже

Метод XPWeakManyToMany.CustomizeTypesInfo() добавляет необходимые метаданные для правильной работы связи Many-To-Many.

Отдельные таблицы хранения объектов связи

Использование единой для всего приложения таблицы может оказаться неприемлемым решением. В этом случае необходимо описать дополнительный персистентный объект для хранения объектов N:M как показано в примере ниже.

В этом примере использована отдельный персистентный класс OwnIntermediateTable, таблица которого будет содержать только связи WeakObjectMs/ WeakObjectNs.

Дополнительно необходимо обновить метаданные и добавить в модуль код, как показано ниже

Метод XPWeakManyToMany.CustomizeTypesInfo() добавляет необходимые метаданные для правильной работы связи Many-To-Many.

Persistent, NonPersistent

Ниже приведен пример такого случая.

Persistent, NonPersistent

В этом примере представлена связь N:M (Many-To-Many) между персистентной сущностью PersistentObjectM2 и неперсистентной сущностью ObjectN.

Пример реализации этого случая в коде:

Эта реализация предполагает, что связь N:M между PersistentObjectM2 и ObjectN2 реализуется через специальный промежуточный персистентный класс, который содержит не типизированные ссылки (weak reference) на персистентных наследников. Существуют ограничения в UI при редактировании этих коллекций.

Также как в случае NonPersistent-NonPersistent может быть использована отдельная таблица хранения объектов связи.

Дополнительно необходимо обновить метаданные и добавить в модуль код, как показано ниже

Метод XPWeakManyToMany.CustomizeTypesInfo() добавляет необходимые метаданные для правильной работы связи Many-To-Many.

Исходный код

О неперсистентных доменных компонентах (Domain Components). Часть 2. Many-To-Many