2008-11-03 8 views
8

Mam następującą strukturę projektu Rozwiązanie:NHibernate Dołączył podklasy w oddzielnych podzespołów

Application.Core.Entities

Application.Xtend.CustomerName.Entities

w projekcie rdzenia Mam podmiot klienta defiend. W projekcie XTend mam zdefiniowaną jednostkę, która podklasuje klienta o nazwie xKlienta (z braku lepszej nazwy w tym momencie ...).

Pomysł polega na tym, że w naszej aplikacji mamy model domeny rdzeniowej. Klient może następnie utworzyć nowy zestaw zawierający rozszerzenia naszego modelu podstawowego. Gdy występuje rozszerzenie, klasa inteligentna IRepository zwróci podklasę klasy podstawowej.

Próbuję odwzorować ten związek na NHibernate. Korzystanie Fluent NHibernate byłem w stanie wygenerować ten mapowanie:

<?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> 

Ale NHib wyrzuca następujący błąd:

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'..

co ma sens xCustomer nie jest zdefiniowany w bibliotece podstawowej.

Czy jest możliwe, aby obejmowały one różne zespoły? Czy zbliżam się do problemu?

Odpowiedz

7

Zadałem to samo pytanie na liście mailingowej użytkowników NHibernate, a rozwiązanie było tak oczywiste, że jestem nieco zawstydzony, że go nie widziałem.

Zespół atrybutu mapowania hibernacji i przestrzeń nazw to wygodne skróty, które pozwalają na uniknięcie pełnego zakwalifikowania nazw klas. Dzięki temu możesz mieć ładne oznaczenie, ale atrybut name zarówno dla elementów klasy, jak i elementów z łączoną-podklasą, może również przyjmować w pełni kwalifikowaną nazwę zespołu.

Więc powyżej uszkodzony plik odwzorowania może być ustalony w taki sposób:

<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> 

To działa jak spodziewałem się, że. Dlatego też przyjrzałem się źródłu Fluent-NHibernate i utworzyłem łatkę zawierającą testy jednostek roboczych, aby rozwiązać problem i submitted it to the project.

Dzięki za pomoc @David Kemp

3

Należy odwzorować za pomocą atrybutu extends elementu <class> (AFAIK, nowy w NHibernate 2.0). Następnie możesz mieć odwzorowanie swojej podklasy (.hbm.xml) w zespole XTend.

Być może trzeba użyć AddAttribute/AddProperty (nie pamiętam jak to się nazywa), aby to zrobić przy użyciu Fluent NHibernate. (Lub prześlij łatkę).

Powiązane problemy