1

У меня есть сценарий, что я хочу добавить некоторые стандартные свойства для моих объектов. Это означает, что у меня будет, например, 1 int и 2 свойства строки, применяемые ко всем соответствующим объектам. У меня более 100 файлов сопоставления, и большинство, но не все будут хозяевами этих новых свойств. В классах легко определить это; однако в сопоставлениях я не нашел ссылки, кроме создания утилиты или xslt, и применял это (How to define reusable <generator> elements in hibernate mapping).Есть ли способ определить свойства многократного использования для сопоставлений n-hibernate?

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

ТНХ для любых ответов

Edit1: пример отображения я хочу добавить

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

edit2: Я снял принятое решение, поскольку с NH 2.1.1 XML Entities не работают (NH-1236), и NH будет выбросить «DTD запрещен в этом документе XML»

ответ

0

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

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

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

, а затем

cfg.BuildSessionFactory(); 

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

0

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

+0

Вы имеете в виду одноразовый скрипт/утилиту, которая будет манипулировать отображениями, которые я хочу, и вводить элементы? – Jaguar

+0

Я имею в виду утилиту, которая возьмет какой-то источник информации и создаст файлы сопоставления, ожидающие спящий режим. Это может означать чтение существующих файлов сопоставления и добавление/удаление элементов из них, но я предпочитаю процесс, в котором у меня есть один источник (например, специальные комментарии в исходных файлах) и который генерирует весь выходной файл. В противном случае у вас появятся ложные ошибки, если кто-то манипулирует выходным файлом таким образом, который смущает генератор кода. У него будет ошибка, и вы этого не сделаете. –

1

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

Если все они определены в базовом классе или интерфейсе, вы можете сопоставить их один раз в базовом классе или интерфейсе и получить с помощью union-subclass. Есть некоторые ограничения. Прочитайте this chapter in the NHibernate documentation об этом.

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

Существует еще один вариант: вы можете использовать Объекты XML. Это довольно примитивная функция из XML, которая поддерживается NHibernate. Прочитайте this chapter in the NH reference documentation, где указано.

+0

XML-сущности кажется лучшим решением, но я не понимаю этого утверждения. «Недостаток такого подхода заключается в том, что NHibernate не генерирует SQL UNION при выполнении полиморфных запросов». Не соответствует ли соответствующий xml в сочетании с отображением до того, как NH потребляет отображение? Кроме того, мне не удается создать его, я не могу найти рабочий пример использования XML-объектов. – Jaguar

+0

Наконец-то я сделал его работу с объектами xml, однако с этим можно определить . Определяющий xml может иметь только один корневой узел и как таковой только -s действительно жизнеспособны. -ing не удалось, элемент необходим для класса – Jaguar

0

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

-У ваших сущностей наследуют от этой базы

-set вверх 'таблицы в иерархии классов'

Вариант 2:

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

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

+0

, к сожалению, для решения компонента требуется дополнительный класс, который не совсем то, что я хочу. Первый вариант является жизнеспособным, но я хочу избежать, потому что подклассы абстрактного класса будут определены в файле сопоставления абстрактного класса, тогда как я предпочел бы решение, в котором я перехожу в файл сопоставления классов A, и определите (каким-то образом) что я хочу унаследовать/впрыснуть свойства абстрактного класса – Jaguar

0

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

+0

, к сожалению, стандартные xml-сопоставления уже выложены. – Jaguar

 Смежные вопросы

  • Нет связанных вопросов^_^