2012-06-16 40 views
0

我有一个我开发的Web应用程序,它有一个相当复杂的保存例程。用户构建并修改一系列计划,然后选择保存数据。所有的添加,删除和修改都会一次保存(全部在单个事务中)。NHibernate:SaveOrUpdate - 儿童上的重复键异常

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) 

这将引发无法与内部异常“指定SQL0803重复键值”插入孩子GenericAdoException。

我正在寻找的行为是NHibernate删除以前的子对象,然后在计划上调用SaveOrUpdate时插入新对象。我怎样才能做到这一点,同时让父母管理关系?

回答

0

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