Однозначное отображение NHibernate, когда данные второй таблицы могут быть нулевыми
-
05-07-2019 - |
Вопрос
У меня есть существующая база данных с таблицей Транзакции в ней. Я добавил новую таблицу с именем TransactionSequence, в которой каждая транзакция в конечном итоге будет иметь только одну запись. Мы используем таблицу последовательности для подсчета транзакций для данной учетной записи. Я сопоставил это как взаимно-однозначное сопоставление, где TransactionSequence имеет первичный ключ TransactionId. Р>
Ограничение состоит в том, что вместо таблицы триггеров в таблице транзакций запрещены обновления отмененных или проведенных транзакций. Р>
Итак, когда последовательность вычисляется и транзакция сохраняется, NHibernate пытается отправить обновление транзакции, например «UPDATE Transaction SET TransactionId =? ГДЕ TransactionId =? '. Но это не из-за триггера. Как настроить сопоставление так, чтобы NHibernate не пытался обновить таблицу транзакций при вставке новой таблицы 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>
Любая помощь будет принята с благодарностью ...
Решение
Отображение один в один в nhibernate не работает так, как вы думаете. Он разработан таким образом, что у вас есть два класса, которые при сохранении в соответствующих таблицах имеют одинаковые первичные ключи.
Однако вы можете заставить это работать, но это не красиво. Я покажу вам, как потом предложить несколько альтернатив:
hbml в вашей транзакции:
<one-to-one name="Sequence" class="TransactionSequence" property-ref="Transaction"/>
В вашей последовательности html:
<many-to-one name="Transaction" class="Transaction" column="fk_Transaction_Sequence" />
должен делать то, что вы от него хотите. Обратите внимание на свойство ref.
Следующий вопрос, который вы собираетесь опубликовать, будет касаться того, как вы лениво загружаетесь в связи один-к-одному. Ответ: ты не можешь ... ну, ты можешь, но это, вероятно, не сработает. Проблема в том, что у вас есть внешний ключ в таблице последовательности, что означает, что nhibernate должен попасть в базу данных, чтобы увидеть, существует ли цель. Тогда вы можете попробовать поиграть с ограниченным = & Quot; true / false & Quot; чтобы узнать, сможете ли вы убедить его лениво загрузить связь один-к-одному.
В целом, это приведет к полной трате вашего времени.
Я предлагаю либо:
<Ол>Это избавит вас от многих головных болей в долгосрочной перспективе.
Другие советы
Оказывается, что для моей ситуации <join table>
отображение работало лучше всего. Мне просто нужно было убедиться, что я сделал свойства, полученные из второй таблицы, обнуляемыми типами, иначе он сохранит данные, даже если ничего не изменилось. Так как мне не нужна ленивая загрузка для второго стола, это прекрасно работает. Я уверен, что я мог получить парные сопоставления "многие к одному" для работы, но это не было интуитивно понятно и кажется более сложным, чем опция таблицы объединения, однако <=> доступен только в NHibernate 2.0 и более поздних версиях.