Что может заставить NHibernate возвращать неверный выбор идентификатора при использовании JET? - PullRequest
1 голос
/ 08 июня 2009

Наше приложение (к сожалению) использует внутреннюю базу данных MDB (т.е. движок JET).

Одним из элементов, сохраняемых в базе данных, является объект «событие». Объект сохраняется в таблице с идентификатором (EventLogID), который является полем Autonumber. Отображение NHibernate выглядит следующим образом:

<class name="EventLogEntry" table="tblEventLog" proxy="IEventLogEntry">
  <id name="Id">
    <column name="EventLogID" not-null="true" />
    <generator class="native" />
  </id>
  <property name="Source" column="ErrorLogSource" />
  <property name="Text" column="EventLogText" />
  <property name="Time" column="EventLogTime" />
  <property name="User" column="UserID" />
  <property name="Device" column="EventDeviceID" />
</class>

Согласно файлу журнала, в некоторых случаях, когда NHibernate пытается получить удостоверение, он получает значение «0». Позже, когда вызывается Flush, NHibernate страдает от ошибки утверждения.

Кто-нибудь может подсказать, почему это может происходить? А еще лучше, кто-нибудь может подсказать, как это исправить?

С уважением, Ричард

1 Ответ

2 голосов
/ 08 июня 2009

Возможно, причиной проблемы является настройка по умолчанию «connection-release-mode».

Некоторое время назад я столкнулся с подобной проблемой и обнаружил, что изменение режима connection.release-режима на 'on_close' (вместо значения по умолчанию after_transaction) решило проблему.

Более подробную информацию можно найти в моем блоге

edit: как я думаю, возможно, это можно решить без изменения режима релиза; что произойдет, если вы используете транзакцию для сохранения своего события?

Режим выпуска по умолчанию - после транзакции, так что я думаю; возможно, когда вы используете явную транзакцию, соединение будет закрыто только после транзакции. Вопрос в том, попытается ли NHibernate получить первичный ключ, который был передан объекту внутри этой транзакции, или он будет использовать другую транзакцию ...

Если это не работает, то изменение режима релиза также решит вашу проблему, но, возможно, это не лучший вариант.
Я думаю, что лучший вариант / решение, это сначала использовать явную транзакцию и посмотреть, решит ли это проблему ...

...