我几天来一直在与这个问题作斗争。
我有几个多对多关系的类,配置如下:
<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]
我一直在玩inverse
和cascade
值并在谷歌上搜索答案,但无法找到任何解决方案。 inverse="true"
和cascade="all/all-delete-orphan"
都没有做到这一点
这是一个与多对多关系有关的问题,还是我看错了方向?
我的类映射不正确吗?
修改
这可能是NHibernate与DateTime结构一起工作的问题吗?
答案 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中提供有关时间戳的版本管理的任何信息,我们将不胜感激。