Mapeo uno a uno de NHibernate donde los datos de la segunda tabla pueden ser nulos

StackOverflow https://stackoverflow.com/questions/244812

  •  05-07-2019
  •  | 
  •  

Pregunta

Tengo una base de datos existente con la tabla Transacciones. He agregado una nueva tabla llamada TransactionSequence donde cada transacción finalmente tendrá un solo registro. Estamos usando la tabla de secuencia para contar las transacciones de una cuenta determinada. He asignado esto como una asignación uno a uno donde TransactionSequence tiene una clave principal de TransactionId.

La restricción es que hay un activador en lugar de en la tabla de transacciones que no permite actualizaciones de transacciones canceladas o registradas.

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 disparador. ¿Cómo puedo configurar mi asignación para que NHibernate no intente actualizar la tabla Transaction cuando se inserta una nueva tabla TransactionSequence?

Mapeo de transacciones:

<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 el mapeo 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 ...

¿Fue útil?

Solución

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

Sin embargo, puedes hacerlo funcionar, pero no es bonito. Te mostraré cómo ofrecer algunas alternativas:

En su Transacción hbml:

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

En su secuencia html:

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

Este debería hacer lo que quieres que haga. Tenga en cuenta la propiedad-ref.

La siguiente pregunta en la que va a publicar va a preguntar cómo obtiene una carga diferida en las asociaciones uno a uno. La respuesta es que no puedes ... bueno, puedes, pero probablemente no funcionará. El problema es que tiene su clave foránea en la tabla de secuencia, lo que significa que nhibernate debe presionar la base de datos para ver si existe el objetivo. Entonces puedes intentar jugar con constreñido = & Quot; verdadero / falso & Quot; para ver si puedes persuadirlo para que cargue perezosamente la asociación uno a uno.

En general, va a resultar en una pérdida total de tiempo.

Sugiero:

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

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

Otros consejos

Resulta que para mi situación un mapeo <join table> funcionó mejor. Solo tenía que asegurarme de que las propiedades que provenían de la segunda tabla eran tipos anulables, o haría una inserción en guardar incluso si nada hubiera cambiado. Como no necesitaba una carga diferida para la segunda tabla, esto funciona muy bien. Estoy seguro de que podría haber emparejado asignaciones de muchos a uno para trabajar, pero no fue intuitivo y parece más complicado que la opción de tabla de unión, sin embargo, <=> solo está disponible en NHibernate 2.0 y versiones posteriores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top