NHibernate:从多对多关系中删除子项会导致异常

时间:2010-07-06 14:05:23

标签: c# nhibernate hibernate

我几天来一直在与这个问题作斗争。

我有几个多对多关系的类,配置如下:

<class name="Entry" table="Entries">
    <id name="Id" column="Id">
      <generator class="native" />
    </id>
    <timestamp name="LastUpdated" column="Entry_LastUpdated" generated="always" />
    ...
    <bag name="Sections" generic="true" table="EntrySections" inverse="false" cascade="none">
      <key column="EntrySection_EntryId" />
      <many-to-many column="EntrySection_SectionId" class="Blogs.BusinessLogic.Section, Blogs.BusinessLogic"/>
    </bag>
</class>

<class name="Section" table="Sections">
    <id name="Id" column="Id" unsaved-value="0">
      <generator class="native" />
    </id>
    <timestamp .../>
    ...
    <bag name="Entries" generic="true" table="EntrySections" inverse="false" cascade="none">
        <key column="EntrySection_SectionId" />
        <many-to-many column="EntrySection_EntryId" class="Blogs.BusinessLogic.Entry, Blogs.BusinessLogic"/>
    </bag>
</class>

它的配置方式我可以删除一个Section对象,并且它与任何条目的关联都将被删除。

但是,当我希望仅删除关联时,例如:

entry.Sections.Remove(section);

这是我对此对象执行的唯一操作。但是,当会话刷新时,将抛出以下StaleObjectStateException异常:

  

行已被另一个事务更新或删除(或未保存的值映射不正确):   [Project.BusinessLogic.Entry#22]

我一直在玩inversecascade值并在谷歌上搜索答案,但无法找到任何解决方案。 inverse="true"cascade="all/all-delete-orphan"都没有做到这一点 这是一个与多对多关系有关的问题,还是我看错了方向? 我的类映射不正确吗?

修改

这可能是NHibernate与DateTime结构一起工作的问题吗?

2 个答案:

答案 0 :(得分:1)

您是否必须将关联的一端标记为“inverse = true”而将另一端标记为“inverse = false”? 通过这样做,您可以定义关联的“所有者”。

答案 1 :(得分:0)

显然我的假设是正确的。问题是由<timestamp/>

引起的

我设计和映射它的方式似乎存在一些问题,或者NHibernate本身可能存在问题 时间戳映射为:

<timestamp name="LastUpdated" column="Entry_LastUpdated" generated="always" />

数据库(MSSQL 2005服务器)中的字段类型为datetime,对象上具有匹配的System.DateTime属性。 这不起作用。

我尝试过其他一些配置as described here by Ayende Rahien,但也无法使其正常工作 最后,我删除了<timestamp/>,并将导致使用代码管理修改日期,同时在需要时添加数字版本字段。

如果有人能在NHibernate中提供有关时间戳的版本管理的任何信息,我们将不胜感激。