我们的应用程序(遗憾地)使用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会出现断言失败。
有谁能说明为什么会这样?更好的是,有人可以建议如何解决它吗?
此致 理查德
答案 0 :(得分:2)
可能是默认的'connection-release-mode'配置设置是导致问题的原因。
前一段时间,我遇到了类似的问题,我发现将connection.release-mode更改为'on_close'(而不是默认的after_transaction)解决了这个问题。
可以找到更多信息on my blog
编辑:正如我想的那样,也许它可以在不改变发布模式的情况下解决;如果您使用交易保存活动会发生什么?
默认的发布模式是在交易之后,所以我在想;也许当您使用显式事务时,连接只会在事务后关闭。问题是,NHibernate会尝试检索已经给予此事务内对象的主键,还是会使用另一个事务...
如果它不起作用,那么更改释放模式也可以解决您的问题,但它可能不是最佳选择。
我认为最好的选择/解决方案是首先使用显式事务,看看这是否解决了问题...