【问题标题】:Why doesn't NHibernate delete orphans first?为什么 NHibernate 不先删除孤儿?
【发布时间】:2010-10-04 20:54:59
【问题描述】:

我试图弄清楚为什么NHibernate 会以这种方式处理一对多级联(使用 cascade=all-delete-orphan)。我遇到了和这个人一样的问题:

Forcing NHibernate to cascade delete before inserts

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

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

【问题讨论】:

  • 只是想在这个问题上增加我的挫败感。 NHibernate 在这种情况下是绝对失败的。我整天都在为这个愚蠢的问题而斗争。即使是最基本的 ORM 也比 NHibernate 更优雅地处理这个问题。我最终不得不完全围绕这个进行编码。你和我一定都错过了什么。

标签: nhibernate


【解决方案1】:

编辑:说了没有理由之后,这里有一个理由。 假设您有以下情况:

public class Dog {
  public DogLeg StrongestLeg {get;set;}
  public IList<DogLeg> Legs {get;set;
}

如果您要先删除,假设您删除了所有 Dog.Legs,那么您可能会删除 StrongestLeg,这会导致引用违规。因此,您不能在更新之前删除。

假设您添加了一条新腿,而这条新腿也是 StrongestLeg。然后您必须在更新之前插入,以便 Leg 具有可以插入到 Dog.StrongestLegId 中的 Id。

所以你必须插入、更新,然后删除。

另外,由于 nHibernate 是基于 Hibernate,我查看了 Hibernate,发现有几个人在谈论同样的问题。

这是他们的最佳答案:

Gail Badner 添加了一条评论 - 2008 年 2 月 21 日下午 2:30:当一个新的 具有生成 ID 的关联实体 被添加到集合中。首先 步骤,合并实体时 包含这个集合,是 级联保存新关联 实体。 级联必须发生在之前 对集合的其他更改。 因为这个新的唯一键 关联实体与 已经持久化的实体,a ConstraintViolationException 是 抛出。这是预期的行为。

【讨论】:

  • 不只是这种情况。基本上任何被引用的实体在被取消引用之前都不能被删除。在插入另一个实体之前,不能更新引用另一个实体的任何实体。
  • 一些RDBMS允许将约束检查推迟到事务结束,所以这不是一个不合理的问题,也是一个非常有效和常见的场景。更多信息stackoverflow.com/questions/1330020/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 2011-01-02
  • 2012-10-22
相关资源
最近更新 更多