tutorial net mvc example ejemplo asp nhibernate orm fluent-nhibernate

mvc - nhibernate vb net example



NHibernate se incorporó a la subclase en ensamblajes independientes (2)

Debe mapear utilizando el atributo extends del elemento <class> (AFAIK, esto es nuevo en NHibernate 2.0). Luego puede tener su mapeo de subclase ( .hbm.xml ) en el ensamblado XTend.

Es posible que tenga que usar AddAttribute / AddProperty (no puede recordar cómo se llama) para hacer esto con Fluent NHibernate. (O envíe un parche).

Tengo la siguiente estructura de proyecto de solución:

Application.Core.Entities

Application.Xtend.CustomerName.Entities

En el proyecto Core, tengo una entidad Customer defiend. En el proyecto XTend, tengo una entidad que define las subclases Cliente llamado xCliente (a falta de un mejor nombre en este momento ...).

La idea aquí es que tenemos un modelo de dominio principal en nuestra aplicación. Un cliente puede crear un nuevo ensamblaje que contenga extensiones para nuestro modelo principal. Cuando el ensamblaje de extensión está presente, una clase inteligente de IRepository devolverá una subclase de la clase principal.

Estoy intentando mapear esta relación en NHibernate . Usando Fluiber NHibernate pude generar este mapeo:

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

Pero NHib arroja el siguiente error:

NHibernate.MappingException: clase persistente Application.Entites.xCustomer, Application.Core.Entites no encontrada ---> System.TypeLoadException: no se pudo cargar el tipo ''Application.Entites.xCustomer'' desde el ensamblado ''Application.Core.Entites, Version = 1.0 .0.0, Culture = neutral, PublicKeyToken = null ''...

Lo cual tiene sentido xCustomer no está definido en la biblioteca Core.

¿Es posible abarcar diferentes ensambles como este? ¿Me estoy equivocando al problema?


Hice esta misma pregunta en la lista de correo de los usuarios de NHibernate y la solución fue tan obvia que estoy algo avergonzado de no haber podido verla.

El conjunto de atributos de asignación de hibernación y el espacio de nombres son accesos directos convenientes que le permiten no tener que calificar completamente sus nombres de clase. Esto le permite obtener una buena calificación, pero el atributo name de ambos elementos class y subclass unidos también puede tomar un nombre de ensamblador totalmente calificado.

Por lo tanto, el archivo de mapeo roto anterior se puede arreglar así:

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

Esto funciona como esperaba. Entonces, eché un vistazo a la fuente Fluent-NHibernate y creé un parche completo con pruebas de la unidad de trabajo para resolver el problema y lo presenté al proyecto .

Gracias por tu ayuda @David Kemp