gpt4 book ai didi

nhibernate - 强制 NHibernate 在插入之前级联删除

转载 作者:行者123 更新时间:2023-12-02 23:01:34 25 4
gpt4 key购买 nike

我有一个父对象,它与子对象的 ISet 具有一对多关系。子对象具有唯一约束(PageNumContentID - 父对象的外键)。

<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"记录。

编辑:显然,当我回答时,我并没有完全注意这个问题,因为这是非主键列上的唯一约束的问题。

我认为您有两种解决方案可供选择:

  1. 在删除后调用 Session.Flush() ,这将执行到该点为止对 session 的所有更改,之后您可以继续其余操作(插入新对象)。这也适用于事务内部,因此您无需担心原子性。
  2. 创建一个 ReplacePage 函数,用新数据更新现有实体,但保持主键和唯一列相同。

关于nhibernate - 强制 NHibernate 在插入之前级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/706673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com