什么会导致NHibernate在使用JET时返回无效的身份选择?

时间:2009-06-08 15:22:27

标签: nhibernate ms-access jet

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

持久存储到数据库的项目之一是“事件”对象。该对象被持久化到一个具有自动编号字段的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尝试获取标识的某些情况下,它会收到值“0”。之后,当调用Flush时,NHibernate会出现断言失败。

有谁能说明为什么会这样?更好的是,有人可以建议如何解决它吗?

此致 理查德

1 个答案:

答案 0 :(得分:2)

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

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

可以找到更多信息on my blog

编辑:正如我想的那样,也许它可以在不改变发布模式的情况下解决;如果您使用交易保存活动会发生什么?

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

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