2008-11-03 10 views
8

je la structure du projet de solution suivante:NHibernate Inscrit subclass dans les assemblées séparées

Application.Core.Entities

Application.Xtend.CustomerName.Entities

Dans le projet de base, j'ai une entité Client defiend. Dans le projet XTend, j'ai une entité définie que les sous-classes Client nommé xCustomer (faute d'un meilleur nom en ce moment ...).

L'idée ici est que nous avons un modèle de domaine Core dans notre application. Un client peut ensuite créer un nouvel assemblage contenant des extensions de notre modèle de base. Lorsque l'assembly d'extension est présent, une classe intelligente IRepository renvoie une sous-classe de la classe principale à la place.

Je tente de mapper cette relation dans NHibernate. En utilisant Fluent NHibernate j'ai pu générer cette cartographie:

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

Mais NHib jette l'erreur suivante:

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

Ce qui fait xCustomer sens n'est pas défini dans la bibliothèque de base.

Est-il possible de répartir différents assemblages comme celui-ci? Est-ce que j'approche le problème?

Répondre

7

J'ai posé cette même question sur la liste de diffusion NHibernate Users et la solution était tellement évidente que je suis quelque peu gêné de ne pas pouvoir la voir. L'ensemble d'attributs de mise en correspondance hibernate et l'espace de noms sont des raccourcis pratiques qui vous permettent de ne pas avoir à qualifier complètement vos noms de classe. Cela vous permet d'avoir la belle balise, mais l'attribut name des éléments class et de sous-classe jointe peut également prendre un nom d'assembly complet.

Ainsi, le fichier de mappage cassé au-dessus peut être fixé comme ceci:

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

Cela fonctionne comme je m'y attendais à. J'ai donc jeté un oeil à la source Fluent-NHibernate et j'ai créé un patch avec des tests d'unité de travail pour résoudre le problème et submitted it to the project. Merci pour votre aide @David Kemp

3

Vous devez mapper en utilisant l'attribut extends de l'élément <class> (AFAIK, c'est nouveau dans NHibernate 2.0). Ensuite, vous pouvez avoir votre mappage de sous-classe (.hbm.xml) dans l'assemblage XTend.

Vous devrez peut-être utiliser le AddAttribute/AddProperty (je ne me souviens plus comment il s'appelle) pour le faire en utilisant Fluent NHibernate. (Ou soumettre un patch).