使用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()