Есть ли способ определить повторно используемые свойства для сопоставлений n-hibernate?

StackOverflow https://stackoverflow.com/questions/1672434

Вопрос

У меня есть сценарий, в котором я хочу добавить некоторые стандартные свойства к своим сущностям.Это означает, что у меня будет, например,1 свойства int и 2 string применяются ко всем соответствующим объектам.У меня есть более 100 файлов сопоставления, и большинство, но не все, будут хостами для этих новых свойств.В классах это легко определить;однако в сопоставлениях я не нашел никакой ссылки, кроме создания утилиты или xslt и ее применения (Как определить повторно используемые <generator> элементы в отображении гибернации).

Однако я хочу иметь возможность добавлять / изменять / удалять свойства из этого "стандартного" сопоставления.

спасибо за любые ответы

Редактировать 1:пример отображения, которое я хочу добавить

<property name="TimeOfEdit" column="TimeOfEdit" type="DateTime" not-null="true"/>
<many-to-one name="EditedBy" column="FK_EditedBy" cascade="save-update" not-null="true" />

Редактировать 2:Я удалил принятое решение, потому что с NH 2.1.1 XML-объекты не работают (NH-1236), и NH выдаст сообщение "DTD запрещено в этом XML-документе".

Это было полезно?

Решение 5

Кажется, что единственный способ сделать это - использовать динамическое отображение (http://ayende.com/Blog/archive/2008/05/01/Dynamic-Mapping-with-NHibernate.aspx)

таким образом, поскольку я уже определил интерфейс, который мои объекты будут использовать для новых свойств (скажем, iaudable), это просто вопрос запуска соответствующего кода при инициализации NH-сеанса

Configuration cfg = new Configuration() Mappings mappings = cfg.CreateMappings(); 
foreach (var persistentClass in mappings.Classes) 
{ 
   if (persistentClass.MappedClass is IAuditable)
   {
     ...
   }
}

и тогда

cfg.BuildSessionFactory();

подключить его и подготовить к использованию примерно для 85 классов влияние на производительность незначительно

Другие советы

Это зависит от того, как эти свойства реализованы в ваших классах.

Если все они определены в базовый класс или интерфейс, вы могли бы сопоставить их один раз в базовом классе или интерфейсе и вывести с помощью union-subclass.Есть некоторые ограничения.Читать эта глава в документации NHibernate об этом.

Если вы решите объединить их в класс, вы могли бы сопоставить их как тип пользователя.Это будет похоже на компонент, но вы могли бы указать некоторые вещи, такие как имена типов, длины и другие, в пользовательском типе.Вам все равно нужно указать имя каждого столбца.

Есть и другой вариант:вы могли бы использовать XML - объекты.Это довольно примитивная функция XML, которая поддерживается NHibernate.Читать эта глава в справочной документации NH где это упомянуто.

Создание специального генератора кода для вашего конкретного случая - ваш единственный вариант.

Вариант 1:
-Определите эти 3 свойства в базовом классе

-должны ли ваши сущности наследовать от этой базы

-настройка "таблицы для иерархии классов"

Вариант 2:

-Определите эти 3 свойства как компонент.

-Вы можете иметь сопоставление для этих 3 свойств в одном файле, который будет использоваться повторно.

Вы могли бы взглянуть на Свободное владение, Это упростит вам картографическую работу.С Помощью автоматического сопоставления вам может понадобиться только абстрактный базовый класс для определения этих свойств.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top