我试图找出为什么NHibernate处理一对多级联(使用cascade = all-delete-orphan)的方式。我和这个家伙遇到了同样的问题:
Forcing NHibernate to cascade delete before inserts
据我所知,NHibernate总是首先执行插入,然后更新,然后删除。可能有一个很好的理由,但我不能为我的生活弄清楚这是什么原因。我希望更好地理解这一点将有助于我提出一个我不讨厌的解决方案:)
这种行为有什么好的理论吗?在什么情况下删除孤儿首先不起作用?所有ORM都以这种方式工作吗?
答案 0 :(得分:2)
编辑:在说没有理由之后,这是一个原因。 假设您有以下情况:
public class Dog {
public DogLeg StrongestLeg {get;set;}
public IList<DogLeg> Legs {get;set;
}
如果您要先删除,并假设您删除了所有Dog.Legs,那么您可以删除会导致引用违规的StrongestLeg。因此,在更新之前不能删除。
假设您添加了一条新腿,而新腿也是StrongestLeg。然后你必须在UPDATE之前插入INSERT,以便Leg有一个可以插入Dog.StrongestLegId的Id。
所以你必须INSERT,UPDATE,然后删除。
同样由于nHibernate基于Hibernate,我看了一下Hibernate,发现有几个人在谈论同样的问题。
以下是他们的最佳答案:
Gail Badner添加了评论 - 21 / Feb / 08 2:30 PM:当一个新的问题出现时 具有生成ID的关联实体 被添加到集合中。首先 合并实体时的步骤 包含这个集合,是 级联保存新关联 实体。 级联必须在之前发生 对集合的其他更改。 因为这个新的唯一键 关联实体与a相同 已经存在的实体,a ConstraintViolationException是 抛出。这是预期的行为。