NHibernate:SaveOrUpdate - Child上的重复键异常

时间:2012-06-16 21:34:05

标签: nhibernate

我有一个我开发的Web应用程序,它有一个相当复杂的保存例程。用户构建并修改一系列计划,然后选择保存数据。此时,所有添加,删除和修改都会一次性保存(所有这些都在一次交易中)。

Plan
    Collection Of Child
        Collection of ChildDetail

大部分保存是通过在计划对象上调用SaveOrUpdate并让此保存来管理计划及其子项来执行的。当我想插入新记录并使用cascade = all-delete-orphan时,我使用零作为未保存的值,以确保在客户端删除子对象或子详细信息对象时删除该对象。

我收到异常但是当发生以下情况时:用户创建一个包含子对象的计划并保存它们。这样可以保存好。

Plan(id=0)
    Child[0](id=0), Child[1](id=0), Child[2](id=0)

如果用户随后删除子对象,并在其位置添加新的子对象,然后尝试保存更改。

Plan(id=123)
    Child[0](id=0), Child[1](id=0), Child[2](id=0)

这会抛出GenericAdoException,无法插入具有内部异常的Child" SQL0803指定的重复键值"。

我正在寻找的行为是NHibernate删除之前的Child对象,然后在Plan上调用SaveOrUpdate时插入新对象。如何在让父母管理关系的同时实现这一目标呢?

1 个答案:

答案 0 :(得分:0)

我暂时找到的解决方案是将已删除子项的ID传递给保存例程。然后,我将新孩子的ID设置为已删除子项的ID。有效地将删除/添加转换为更新。