2008-11-03 10 views
8

Ich habe folgende Lösung Projektstruktur:NHibernate beigetreten Subclass in separaten Baugruppen

Application.Core.Entities

Application.Xtend.CustomerName.Entities

Im Kern Projekt, das ich eine Entität Kunden defiend haben. Im XTend-Projekt habe ich eine Entität definiert, die die Unterklassen Customer mit dem Namen xCustomer (mangels eines besseren Namens zu diesem Zeitpunkt ...) definiert.

Die Idee hier ist, dass wir ein Core-Domain-Modell in unserer Anwendung haben. Ein Kunde kann dann eine neue Assembly erstellen, die Erweiterungen für unser Kernmodell enthält. Wenn die Erweiterungsbaugruppe vorhanden ist, gibt eine intelligente Klasse IRepository stattdessen eine Unterklasse der Hauptklasse zurück.

Ich versuche, diese Beziehung in NHibernate abzubilden. Mit Fluent NHibernate konnte ich diese Zuordnung generieren:

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

Aber NHib führt den folgenden Fehler:

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

Welchen Sinn xCustomer macht, ist nicht in der Core-Bibliothek definiert.

Ist es möglich, verschiedene Baugruppen so zu überspannen? Komme ich das Problem falsch an?

Antwort

7

Ich habe diese Frage auf der NHibernate Users Mailingliste gestellt und die Lösung war so offensichtlich, dass es mir etwas peinlich ist, dass ich sie nicht sehen konnte.

Die Hibernate-Mapping-Attribute Assembly und Namespace sind bequeme Abkürzungen, mit denen Sie Ihre Klassennamen nicht vollständig qualifizieren müssen. Auf diese Weise können Sie eine gute Markierung erzielen, aber das name-Attribut von Klassen- und Joined-Subclass-Elementen kann auch einen vollständig qualifizierten Assemblynamen enthalten.

So ist die oben gebrochen Mapping-Datei kann wie so festgelegt werden:

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

Das funktioniert, wie ich es erwartet hatte. Also habe ich mir dann die Fluent-NHibernate-Quelle angeschaut und einen Patch mit Arbeitseinheitstests erstellt, um das Problem zu beheben und submitted it to the project.

Danke für Sie Hilfe @David Kemp

3

Sie müssen mit dem extends Attribut des Elements <class> (AFAIK, das ist neu in NHibernate 2.0) zuordnen. Dann können Sie Ihre Unterklassenzuordnung (.hbm.xml) in der XTend-Assembly haben.

Möglicherweise müssen Sie AddAttribute/AddProperty verwenden (kann sich nicht erinnern, wie es heißt), um dies mit Fluent NHibernate zu tun. (Oder senden Sie einen Patch).