1

我们的应用程序(很遗憾)使用了 MDB 后端数据库(即 JET 引擎)。

持久化到数据库的项目之一是“事件”对象。该对象被持久化到一个 ID (EventLogID) 的表中,该 ID 是一个自动编号字段。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 遭受断言失败。

谁能建议为什么会发生这种情况?更好的是,任何人都可以建议如何解决它?

问候,理查德

4

1 回答 1

2

可能是默认的 'connection-release-mode' 配置设置是问题的原因。

不久前,我遇到了类似的问题,我发现将 connection.release-mode 更改为 'on_close'(而不是默认的 after_transaction)解决了这个问题。

更多信息可以在我的博客上找到

编辑:正如我所想,也许它也可以在不改变发布模式的情况下解决;如果您使用事务来保存您的事件会发生什么?

默认发布模式是交易后,所以我在想;也许当您使用显式事务时,连接只会在事务之后关闭。问题是,NHibernate 会尝试检索已在此事务中提供给对象的主键,还是会使用另一个事务...

如果它不起作用,那么更改发布模式也可以解决您的问题,但这可能不是最佳选择。
我认为最好的选择/解决方案是首先使用显式事务,看看这是否解决了问题......

于 2009-06-08T15:26:41.500 回答