我遇到了同样的问题......我有一个实体,它有一个集合,该集合映射到一个包含唯一约束的表。
我不明白的是,根据 Stuarts 的回复,集合删除应该发生在集合插入之前?当我深入研究 NHibernate 源代码时,我找到了CollectionUpdateAction
该类,该类在其Execute
方法中包含以下代码:
persister.DeleteRows(collection, id, session);
persister.UpdateRows(collection, id, session);
persister.InsertRows(collection, id, session);
然后,我会假设删除是在插入之前执行的,但显然情况并非如此。这个场景中没有使用 CollectionUpdateAction 吗?何时使用 CollectionUpdateAction?
回答:
我已经像这样解决了这个问题:
- 在我的映射中,我将级联选项设置为“delete-orphan”而不是“all-delete-orphan”
我所有的数据库访问都通过存储库进行;在我的存储库的保存方法中,我的实体有以下代码:
public void Save( Order orderObj )
{
// Only starts a transaction when there is no transaction
// associated yet with the session
With.Transaction(session, delegate()
{
session.SaveOrUpdate (orderObj);
session.Flush();
foreach( OrderLine line in orderObj.Lines )
{
session.SaveOrUpdate (line);
}
};
}
因此,我保存了 orderObj,并且因为级联设置为 delete-orphan,要删除的对象将从数据库中删除。
调用后SaveOrUpdate
,我必须确保将更改刷新到数据库。
由于 delete-orphan 级联设置确保没有插入或更新 OrderLine,我必须遍历我的集合,并为每个 OrderLine 调用“SaveOrUpdate”。这将确保插入新的 OrderLines,并更新修改过的 OrderLines。不会对未更改的 OrderLines 执行任何操作。
虽然它不是理想的解决方案(恕我直言,这是一个丑陋的黑客攻击),但它确实有效,并且它在存储库后面被抽象出来,所以这就是我现在处理这个问题的方式......