代码之家  ›  专栏  ›  技术社区  ›  Richard J Foster

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

  •  1
  • Richard J Foster  · 技术社区  · 15 年前

    我们的应用程序(遗憾的是)使用了一个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 回复  |  直到 15 年前
        1
  •  2
  •   Frederik Gheysels    15 年前

    可能是默认的“连接释放模式”配置设置导致了这些问题。

    不久前,我遇到了一个类似的问题,我发现将connection.release-mode更改为“on_close”(而不是事务处理后的默认值)解决了这个问题。

    可以找到更多信息 on my blog

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

    默认的发布模式是在事务之后,所以我在想;也许当您使用显式事务时,连接将只在事务之后关闭。当然,问题是,nhibernate是否会尝试检索已在此事务内授予对象的主键,或者它是否会使用另一个事务…

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

    推荐文章