2009-05-12 7 views
5

Tengo una tabla llamada "Orderrow". Orderrow tiene una clave primaria compuesta (CPK) con las siguientes columnas: ID de pedido, IdProducto, Número de filaNHibernate mapeo de llaves primarias múltiples

ID de pedido y IdProducto también son claves externas que hacen referencia a las tablas Orden y Producto. RowNumber se genera en la aplicación.

Me preguntaba cómo se mapea esto en NHibernate porque solo puedo establecer 1 elemento de id y 1 de subelemento de generador.

Respuesta

6

Hay una propiedad 'identificador compuesto' que puede usar en su asignación de clase en lugar de la propiedad 'id'. Sin embargo, debe saber que el equipo de nHibernate desaconseja su uso. Parece que está tratando con una base de datos heredada, en la que no tiene control sobre el esquema. Entonces, la 'identificación compuesta' es específicamente para su situación.

Mira la documentación NH Para obtener más información: http://nhibernate.info/doc/nh/en/index.html

+0

leí que también en la API de ref NHibernate. Pero no tengo una base de datos "heredada", solo una base de datos para fines de investigación, así que puedo cambiar fácilmente la tabla de Orderrow aquí. Entonces, ¿cuál es la mejor opción preferida en el diseño de mesas? ¿Debo crear 1 clave primaria en la tabla Orderrow que sea única por fila? –

+0

Sí. Una única columna única para primaria es preferible. – NathanD

0

personalmente no me gusta tener las claves primarias compuestas en mis esquemas de tablas de bases de datos, además de que por lo general son 'duros' de manejar por cualquier asignador de ORM lo intentara. Si tengo que dar una identidad única a una fila en una tabla (especialmente si representa un objeto comercial), prefiero usar un valor único Id sustituto - un GUID o un Entero - si alguno de los campos de la tabla no está no es adecuado Usar un Id. Compuesto siempre es problemático cuando escribo consultas y uniones de interrogación, así que mi estrategia habitual es usar un Id sustituto (que no tiene ningún significado para el objeto de negocio sino identificar el objeto mismo) y colocar una restricción única en los campos de el CPK anterior.

9

Aquí se muestra un ejemplo utilizando la propiedad composite-id en un archivo de asignación de NHibernate:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Model"> 

    <class name="Program" table="program"> 
    <composite-id> 
     <key-property name="Id" column="id"></key-property> 
     <key-property name="Prog" column="prog"></key-property> 
     <key-property name="Site" column="site"></key-property> 
    </composite-id> 
    <property name="ActiveDate" column="active_date"/> 
    <property name="Year" column="year"/> 
    </class> 

</hibernate-mapping> 
Cuestiones relacionadas