NHibernate картографиране едно към едно, където данните от втората таблица могат да бъдат нулеви

Имам съществуваща база данни с таблицата Transactions в нея. Добавих нова таблица, наречена TransactionSequence, където всяка транзакция в крайна сметка ще има само един запис. Ние използваме таблицата с последователности, за да преброим транзакциите за даден акаунт. Картографирах това като съпоставяне едно към едно, където TransactionSequence има първичен ключ на TransactionId.

Ограничението е, че в таблицата с транзакции има тригер вместо, който не позволява актуализации на отменени или публикувани транзакции.

Така че, когато последователността е изчислена и транзакцията е запазена, NHibernate се опитва да изпрати актуализация на транзакцията като 'UPDATE Transaction SET TransactionId =? WHERE TransactionId = ?'. Но това се проваля поради спусъка. Как мога да конфигурирам картографирането си така, че NHibernate да не се опитва да актуализира таблицата Transaction, когато се вмъкне нова таблица TransactionSequence?

Картографиране на транзакция:

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

И картографирането на последователността:

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

Всяка помощ ще бъде високо оценена...


person SteveBering    schedule 28.10.2008    source източник


Отговори (2)


Картографирането едно към едно в nhibernate не работи така, както си мислите. Той е проектиран така, че да имате два класа, които, когато се поддържат в съответните им таблици, имат еднакви първични ключове.

Въпреки това можете да го накарате да работи, но не е красиво. Ще ви покажа как тогава предложете някои алтернативи:

Във вашата транзакция hbml:

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

Във вашата последователност html:

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

Това трябва да прави това, което искате. Обърнете внимание на имот-реф.

Следващият въпрос, който ще публикувате, ще попита как ви мързи да зареждате асоциации едно към едно. Отговорът е, че не можете... е, можете, но вероятно няма да работи. Проблемът е, че имате вашия външен ключ в таблицата с последователности, което означава, че nhibernate трябва да удари базата данни, за да види дали целта съществува. След това можете да опитате да си поиграете с constrained="true/false", за да видите дали можете да го убедите да зареди лениво асоциацията едно към едно.

Като цяло, това ще доведе до пълна загуба на вашето време.

Предлагам или:

  1. Имате две асоциации много към едно.
  2. Имайте асоциация много към едно с колекция от другата страна.

Това ще ви спести много главоболия в дългосрочен план.

person jonnii    schedule 28.10.2008
comment
Имате ли пример за това как да използвате 2 many-to-one асоциации? Защото един от тях трябва да използва външния ключ на другата таблица. - person Răzvan Flavius Panda; 04.07.2015

Оказва се, че за моята ситуация <join table> картографиране работи най-добре. Просто трябваше да се уверя, че съм направил свойствата, които идват от втората таблица, да са nullable типове, или ще направи вмъкване при запазване, дори ако нищо не се е променило. Тъй като нямах нужда от мързеливо зареждане за втората таблица, това работи чудесно. Сигурен съм, че можех да накарам съпоставянията много към едно да работят, но не беше интуитивно и изглежда по-сложно от опцията за присъединяване към таблицата, но <join table> е достъпно само в NHibernate 2.0 и по-нова версия.

person SteveBering    schedule 29.10.2008