1

私たちのアプリケーションは (悲しいことに) MDB バックエンド データベース (つまり、JET エンジン) を使用しています。

データベースに永続化される項目の 1 つは、「イベント」オブジェクトです。オブジェクトは、Autonumber フィールドである ID (EventLogID) を持つテーブルに永続化されます。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 が ID を取得しようとすると、値「0」を受け取る場合があります。その後、Flush が呼び出されると、NHibernate はアサーション エラーに悩まされます。

なぜこれが起こっているのか誰にも示唆できますか?さらに良いことに、誰かがそれを修正する方法を提案できますか?

よろしく、リチャード

4

1 に答える 1

2

デフォルトの「connection-release-mode」構成設定が問題の原因である可能性があります。

少し前に、同様の問題に遭遇しました。connection.release-mode を (デフォルトの after_transaction ではなく) 'on_close' に変更すると、問題が解決することがわかりました。

詳細については、私のブログをご覧ください

編集:私が考えているように、リリースモードも変更せずに解決できる可能性があります。トランザクションを使用してイベントを保存するとどうなりますか?

デフォルトのリリースモードはトランザクション後なので、考えています。おそらく、明示的なトランザクションを使用する場合、接続はトランザクション後にのみ閉じられます。もちろん問題は、NHibernate がこのトランザクション内のオブジェクトに与えられた主キーを取得しようとするか、それとも別のトランザクションを使用するかということです...

うまくいかない場合は、リリースモードを変更すると問題も解決しますが、最適なオプションではない可能性があります。
最良のオプション/解決策は、最初に明示的なトランザクションを使用し、これで問題が解決するかどうかを確認することだと思います...

于 2009-06-08T15:26:41.500 に答える