2008-10-28 9 views
11

Tengo una base de datos existente con la tabla Transacciones en ella. He agregado una nueva tabla llamada TransactionSequence donde cada transacción finalmente tendrá un solo registro. Estamos usando la tabla de secuencias para contar las transacciones de una cuenta determinada. He correlacionado esto como una asignación de uno a uno donde TransactionSequence tiene una clave principal de TransactionId.Cartografía NHibernate uno a uno donde los datos de la segunda tabla pueden ser nulos

La restricción es que hay una activación en lugar de la tabla de transacciones que no permite actualizaciones de transacciones canceladas o contabilizadas.

Entonces, cuando se calcula la secuencia y se guarda la transacción, NHibernate intenta enviar una actualización de la transacción como 'ACTUALIZAR Transacción SET TransactionId =? DONDE TransactionId =? '. Pero esto falla debido al desencadenante. ¿Cómo puedo configurar mi asignación para que NHibernate no intente actualizar la tabla de transacciones cuando se inserta una nueva tabla TransactionSequence?

Transacción mapeo:

<class name="Transaction" table="Transaction" dynamic-update="true" select-before-update="true"> 
    <id name="Id" column="ID"> 
     <generator class="native" /> 
    </id> 

    <property name="TransactionTypeId" access="field.camelcase-underscore" /> 
    <property name="TransactionStatusId" column="DebitDebitStatus" access="field.camelcase-underscore" /> 

    <one-to-one name="Sequence" class="TransactionSequence" fetch="join" 
       lazy="false" constrained="false">  
    </one-to-one> 
</class> 

Y la asignación de secuencia:

<class name="TransactionSequence" table="TransactionSequence" dynamic-update="true"> 
    <id name="TransactionId" column="TransactionID" type="Int32"> 
     <generator class="foreign"> 
      <param name="property">Transaction</param> 
     </generator> 
    </id> 

    <version name="Version" column="Version" unsaved-value="-1" access="field.camelcase-underscore" /> 

    <property name="SequenceNumber" not-null="true" /> 

    <one-to-one name="Transaction" 
       class="Transaction" 
       constrained="true" 
       foreign-key="fk_Transaction_Sequence" /> 

</class> 

Cualquier ayuda sería muy apreciada ...

Respuesta

15

uno a uno de mapeo en nhibernate no funciona de la forma en que crees que lo hace. Está diseñado para que tenga dos clases, que cuando persisten en sus tablas correspondientes tienen las mismas claves principales.

Sin embargo, puede hacerlo funcionar, pero no es bonito. Te voy a mostrar cómo a continuación, ofrecer algunas alternativas:

En su hbml Transacción:

<one-to-one name="Sequence" class="TransactionSequence" property-ref="Transaction"/> 

en la secuencia de html:

<many-to-one name="Transaction" class="Transaction" column="fk_Transaction_Sequence" /> 

Este debe hacer lo que usted quiere que hacer. Tenga en cuenta la propiedad-ref.

La siguiente pregunta que va a publicar va a preguntar cómo obtener la carga diferida en las asociaciones de uno a uno. La respuesta es: no puedes ... bueno, puedes, pero probablemente no funcionará. El problema es que tiene su clave externa en la tabla de secuencia, lo que significa que nhibernate tiene que golpear la base de datos para ver si existe el objetivo. Luego puede intentar jugar con constrained = "true/false" para ver si puede persuadirlo de que cargue la asociación uno a uno.

Con todo, va a resultar en una pérdida total de tiempo.

Yo sugeriría o:

  1. Tiene dos asociaciones muchos-a-uno.
  2. Tiene una asociación muchos a uno con una colección en el otro extremo.

Esto le ahorrará muchos dolores de cabeza a largo plazo.

+0

¿Tiene algún ejemplo de cómo usar 2 asociaciones 'muchos-a-uno'? Porque uno de ellos necesita usar la clave externa de la otra tabla. –

2

Resulta que para mi situación un mapeo <join table> funcionó mejor.Solo tenía que asegurarme de que hice que las propiedades que venían de la segunda tabla fueran tipos anulables, o haría una inserción en guardar incluso si nada hubiera cambiado. Como no necesitaba carga lenta para la segunda mesa, esto funciona muy bien. Estoy seguro de que podría haber conseguido emparejamientos emparejados de uno a uno, pero no fue intuitivo y parece más complicado que la opción de combinación de tablas, sin embargo, <join table> solo está disponible en NHibernate 2.0 y posteriores.

Cuestiones relacionadas