使用NHibernate将实体移动到另一个父级会产生唯一的密钥冲突错误

使用NHibernate将实体移动到另一个父级会产生唯一的密钥冲突错误,nhibernate,Nhibernate,我在我的项目中使用NHibernate。我只是想听听你的意见。我面临的问题如下: 我有三个相关的DB表。关系如下所示 表1(字段1_PK,其他_字段) 表2(Field1_PK、Field2_FK_To_Table1_PK、其他_字段) 表3(字段1_PK、字段2_FK_至_表2_PK、其他_字段) 表3-->表2-->表1 我有这三个实体的单独NH映射文件。这些表之间的关系使用标记映射到文件中。还指定了cascade=“全部删除孤立项”。现在,我正在尝试将表3中的一条记录移动到表2中尚不存

我在我的项目中使用NHibernate。我只是想听听你的意见。我面临的问题如下:

我有三个相关的DB表。关系如下所示

  • 表1(字段1_PK,其他_字段)
  • 表2(Field1_PK、Field2_FK_To_Table1_PK、其他_字段)
  • 表3(字段1_PK、字段2_FK_至_表2_PK、其他_字段)
表3-->表2-->表1

我有这三个实体的单独NH映射文件。这些表之间的关系使用标记映射到文件中。还指定了cascade=“全部删除孤立项”。现在,我正在尝试将表3中的一条记录移动到表2中尚不存在的另一条记录,这需要移动到表1中的另一条记录。因此,理想情况下,作为单个事务,以下步骤应按指定顺序进行: 1.从表3中删除记录 2.从表2中删除旧记录 3.从表1中删除旧记录 4.在表1中创建新记录 5.在表2中创建新记录 6.在表3中创建新记录

为此,我检索了Table3记录实体并更改了其属性,使其与新的Table2记录实体相关联

不幸的是,我得到了唯一密钥冲突错误,该错误是基于Table3唯一密钥引发的。原因是步骤6(插入)首先发生。由于该表已经有一个具有相同键的记录,因此它会抛出错误。我从表中删除了唯一键索引,发现功能运行良好,但同样的步骤6首先发生。但总的来说,该功能运行良好。但是,我必须在表中有唯一的键索引

如果你对此有任何想法,请写下你的评论


Daniel

这是nhib文件,显示了执行顺序:

SQL语句按以下顺序发出

  • 所有实体插入,以相同的顺序插入相应的对象 已使用ISession.Save()保存
  • 所有实体更新
  • 所有集合删除
  • 所有集合元素的删除、更新和插入
  • 所有集合插入
  • 所有实体删除,以相同的顺序删除相应的对象 已使用ISession.Delete()删除
  • 因此,解决问题的最简单方法是在删除实体后立即显式调用session.Flush()