2008-11-03 2 views
8

I имеет следующую структуру проекта решения:NHibernate Регистрация Подкласса в отдельных сборках

Application.Core.Entities

Application.Xtend.CustomerName.Entities

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

Идея здесь в том, что у нас есть модель ядра в нашем приложении. Затем клиент может создать новую сборку, содержащую расширения нашей основной модели. Когда узел расширения присутствует, класс smart 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: persistent class Application.Entites.xCustomer, Application.Core.Entites not found ---> System.TypeLoadException: Could not load type 'Application.Entites.xCustomer' from assembly 'Application.Core.Entites, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'..

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

Возможно ли охватывать различные сборки следующим образом? Я неправильно подхожу к проблеме?

ответ

7

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

Агрегация атрибутов отображения и пространства имен hibernate - это удобные короткие сокращения, которые позволяют вам не полностью квалифицировать имена классов. Это позволяет вам иметь хорошую отметку, но атрибут имени как класса, так и элемента 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 и создал патч в комплекте с тестовыми модулями для решения проблемы и submitted it to the project.

Спасибо за помощь @ Давид Кемп

3

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

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

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