NHibernate присоединился к подклассу в отдельных сборках - PullRequest
8 голосов
/ 03 ноября 2008

У меня есть следующая структура проекта решения:

Application.Core.Entities

Application.Xtend.CustomerName.Entities

В базовом проекте у меня есть сущность Клиент защитник. В проекте XTend у меня есть сущность, определившая этот подкласс Customer с именем xCustomer (из-за отсутствия лучшего имени в настоящее время ...).

Идея в том, что у нас есть модель ядра домена в нашем приложении. Затем клиент может создать новую сборку, которая содержит расширения для нашей базовой модели. При наличии сборки расширения интеллектуальный класс IRepository вместо этого возвращает подкласс основного класса.

Я пытаюсь отобразить эти отношения в NHibernate . Используя Fluent NHibernate Мне удалось создать это отображение:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   default-lazy="false"
                   assembly="NHibernate.Core.Entites"
                   namespace="NHibernate.Entites"
                   default-access="field.camelcase-underscore">
  <!-- Customer is located in assembly Application.Core.Entities -->
  <class name="Customer" table="Customers" xmlns="urn:nhibernate-mapping-2.2">
    <id name="Id" column="Id" type="Int64">
      <generator class="native" />
    </id>
    <component name="Name" insert="true" update="true">
      <property name="LastName" column="LastName" length="255" type="String" not-null="true">
        <column name="LastName" />
      </property>
      <property name="FirstName" column="FirstName" length="255" type="String" not-null="true">
        <column name="FirstName" />
      </property>
    </component>
    <!-- xCustomer is located in assembly Application.XTend.CustomerName.Entities -->
    <joined-subclass name="xCustomer" table="xCustomer">
      <key column="CustomerId" />
      <property name="CustomerType" column="CustomerType" length="255" type="String" not-null="true">
        <column name="CustomerType" />
      </property>
    </joined-subclass>
  </class>
</hibernate-mapping>

Но NHib выдает следующую ошибку:

NHibernate.MappingException: постоянный класс Application.Entites.xCustomer, Application.Core.Entites не найдено ---> System.TypeLoadException: не удалось загрузить тип 'Application.Entites.xCustomer' из сборка 'Application.Core.Entites, Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = NULL»..

Что имеет смысл xCustomer не определен в библиотеке Core.

Можно ли охватить разные сборки, как это? Я неправильно подхожу к проблеме?

Ответы [ 2 ]

7 голосов
/ 04 ноября 2008

Я задал этот же вопрос в списке рассылки NHibernate Users, и решение было настолько очевидным, что я несколько смутился, что не смог его увидеть.

Сборка атрибутов hibernate-mapping и пространство имен - это удобные ярлыки, которые позволяют вам не обязательно полностью определять имена классов. Это позволяет вам иметь хорошую разметку, но атрибут name для элементов class и join-subclass также может принимать полное имя сборки.

Таким образом, вышеуказанный битый файл сопоставления можно исправить так:

<joined-subclass name="Application.XTend.CustomerName.Entities.xCustomer, 
                 Application.XTend.CustomerName.Entities, Version=1.0.0.0, 
                 Culture=neutral, PublicKeyToken=null" 
                 table="xCustomer">
  <key column="CustomerId" />
  <property name="CustomerType" column="CustomerType" length="255" 
            type="String" not-null="true">
    <column name="CustomerType" />
  </property>
</joined-subclass>

Это работает так, как я ожидал. Затем я посмотрел на источник Fluent-NHibernate и создал патч с работающими юнит-тестами для решения проблемы и отправил его в проект .

Спасибо за помощь @David Kemp

3 голосов
/ 04 ноября 2008

Вам необходимо сопоставить, используя атрибут extends элемента <class> (AFAIK, это новое в NHibernate 2.0). Тогда вы можете иметь свое отображение подкласса (.hbm.xml) в сборке XTend.

Возможно, вам придется использовать AddAttribute / AddProperty (не помню, как он называется), чтобы сделать это с помощью Fluent NHibernate. (Или представьте патч).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...