NHibernare il mapping uno a uno in cui i dati della seconda tabella possono essere nulli

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

  •  05-07-2019
  •  | 
  •  

Domanda

Ho un database esistente con la tabella Transazioni al suo interno. Ho aggiunto una nuova tabella denominata TransactionSequence in cui ogni transazione alla fine avrà un solo record. Stiamo utilizzando la tabella delle sequenze per contare le transazioni per un determinato account. Ho mappato questo come un mapping uno a uno in cui TransactionSequence ha una chiave primaria di TransactionId.

Il vincolo è che nella tabella delle transazioni è presente un trigger anziché trigger che non consente gli aggiornamenti delle transazioni annullate o registrate.

Quindi, quando la sequenza viene calcolata e la transazione viene salvata, NHibernate tenta di inviare un aggiornamento sulla transazione come 'UPDATE Transaction SET TransactionId =? DOVE TransactionId =? '. Ma questo non riesce a causa del grilletto. Come posso configurare il mio mapping in modo che NHibernate non tenti di aggiornare la tabella Transaction quando viene inserita una nuova tabella TransactionSequence?

Mappatura delle transazioni:

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

E la mappatura della sequenza:

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

Qualsiasi aiuto sarebbe molto apprezzato ...

È stato utile?

Soluzione

La mappatura one-to-one in nhibernate non funziona come credi. È progettato in modo da avere due classi, che una volta mantenute nelle rispettive tabelle hanno le stesse chiavi primarie.

Comunque puoi farlo funzionare, ma non è carino. Ti mostrerò come offrire alcune alternative:

Nel tuo hbml di transazione:

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

Nella tua sequenza html:

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

Questo dovrebbe fare quello che vuoi che faccia. Nota il riferimento alla proprietà.

La prossima domanda che pubblicheremo sarà quella di sapere come ottenere un caricamento lento su associazioni one-to-one. La risposta è che non puoi ... beh, puoi, ma probabilmente non funzionerà. Il problema è che hai la tua chiave esterna nella tabella delle sequenze, il che significa che nhibernate deve colpire il database per vedere se esiste la destinazione. Quindi puoi provare a giocare con vincolo = & Quot; true / false & Quot; per vedere se riesci a convincerlo a caricare pigramente l'associazione uno a uno.

Tutto sommato, si tradurrà in una totale perdita di tempo.

Suggerisco:

  1. Avere due associazioni one-to-one.
  2. Avere un'associazione molti-a-uno con una raccolta all'altra estremità.

Questo a lungo termine ti farà risparmiare un sacco di mal di testa.

Altri suggerimenti

Si scopre che per la mia situazione una mappatura <join table> ha funzionato meglio. Dovevo solo assicurarmi che le proprietà che derivavano dalla seconda tabella fossero tipi nullable, altrimenti avrebbe fatto un inserimento al salvataggio anche se nulla fosse cambiato. Dal momento che non avevo bisogno di un caricamento lento per il secondo tavolo, questo funziona alla grande. Sono sicuro che avrei potuto far funzionare le mappature multi-to-one accoppiate per funzionare, ma non era intuitivo e sembra più complicato dell'opzione tabella join, tuttavia <=> è disponibile solo in NHibernate 2.0 e versioni successive.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top