NHibernate为什么不首先删除孤儿?

时间:2010-10-04 20:55:00

标签: nhibernate

我试图找出为什么NHibernate处理一对多级联(使用cascade = all-delete-orphan)的方式。我和这个家伙遇到了同样的问题:

Forcing NHibernate to cascade delete before inserts

据我所知,NHibernate总是首先执行插入,然后更新,然后删除。可能有一个很好的理由,但我不能为我的生活弄清楚这是什么原因。我希望更好地理解这一点将有助于我提出一个我不讨厌的解决方案:)

这种行为有什么好的理论吗?在什么情况下删除孤儿首先不起作用?所有ORM都以这种方式工作吗?

1 个答案:

答案 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是   抛出。这是预期的行为。