作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个父对象,它与子对象的 ISet
具有一对多关系。子对象具有唯一约束(PageNum
和 ContentID
- 父对象的外键)。
<set name="Pages" inverse="true" cascade="all-delete-orphan" access="field.camelcase-underscore">
<key column="ContentId" />
<one-to-many class="DeveloperFusion.Domain.Entities.ContentPage, DeveloperFusion.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</set>
我遇到的问题是,如果我从父集合中删除 ContentPage
元素,然后在同一事务中添加一个具有相同唯一键的新元素...您将获得一个唯一的违反约束,因为 NHibernate尝试在删除之前执行插入。
有没有办法强制 NHibernate 首先执行删除?
最佳答案
没有选项可以指定事务中的操作顺序,因为它是硬编码的,如下(来自文档):
The SQL statements are issued in the following order
- all entity insertions, in the same order the corresponding objects were saved using ISession.Save()
- all entity updates
- all collection deletions
- all collection element deletions, updates and insertions
- all collection insertions
- all entity deletions, in the same order the corresponding objects were deleted using ISession.Delete()
(An exception is that objects using native ID generation are inserted when they are saved.)
因此,我可以要求您回答为什么要添加具有现有标识符的新实体吗?标识符对于特定“实体”应该是唯一的。如果该实体消失了,那么它的标识符也应该消失。
另一个选择是对该记录进行更新而不是删除/插入。这会保持 ID 相同,因此不会违反唯一约束(至少在键上),并且您可以更改所有其他数据,使其成为"new"记录。
编辑:显然,当我回答时,我并没有完全注意这个问题,因为这是非主键列上的唯一约束的问题。
我认为您有两种解决方案可供选择:
Session.Flush()
,这将执行到该点为止对 session 的所有更改,之后您可以继续其余操作(插入新对象)。这也适用于事务内部,因此您无需担心原子性。ReplacePage
函数,用新数据更新现有实体,但保持主键和唯一列相同。关于nhibernate - 强制 NHibernate 在插入之前级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/706673/
我是一名优秀的程序员,十分优秀!