Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate 为什么';先删除孤儿吗?_Nhibernate - Fatal编程技术网

Nhibernate 为什么';先删除孤儿吗?

Nhibernate 为什么';先删除孤儿吗?,nhibernate,Nhibernate,我试图弄明白为什么要用这种方式处理一对多级联(使用cascade=all-delete-orphan)。我遇到了和这家伙一样的问题: 据我所知,NHibernate总是先执行插入,然后更新,然后删除。这可能有一个很好的理由,但我一辈子都搞不清楚原因是什么。我希望更好地理解这一点能帮助我想出一个我并不讨厌的解决方案:) 关于这种行为有什么好的理论吗?在什么情况下,首先删除孤儿不起作用?所有的ORM都是这样工作的吗?编辑:在说没有理由之后,这里有一个理由。 假设您有以下场景: public cla

我试图弄明白为什么要用这种方式处理一对多级联(使用cascade=all-delete-orphan)。我遇到了和这家伙一样的问题:

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


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

编辑:在说没有理由之后,这里有一个理由。 假设您有以下场景:

public class Dog {
  public DogLeg StrongestLeg {get;set;}
  public IList<DogLeg> Legs {get;set;
}
公共级狗{
公共狗腿StrongestLeg{get;set;}
公共IList腿{get;set;
}
如果您要先删除,并且假设您删除了所有的Dog.Legs,那么您可能会删除StrongeStreg,这将导致引用冲突。因此,您不能在更新之前删除

假设您添加了一条新的腿,并且该新腿也是StrongeStreg。然后您必须在更新之前插入,以便该腿具有可以插入Dog.StrongeStregid的Id

因此,您必须插入、更新,然后删除

另外,由于nHibernate是基于Hibernate的,我对Hibernate进行了研究,发现有几个人在谈论同一个问题

下面是他们的最佳答案:

盖尔·巴德纳(Gail Badner)在2008年2月21日下午2:30补充了一条评论:当一个新的 具有生成的ID的关联实体 已添加到集合中。第一个 步骤,合并实体时 包含此集合的,是 级联保存新关联 实体。级联必须在 对集合的其他更改。 因为这个新的 关联实体与关联实体相同 已持久化的实体,即 ConstraintViolationException为 抛出。这是预期的行为


我只是想给这个问题增加我的挫折感。在这种情况下,NHibernate是一个绝对的失败。我已经为这个愚蠢的问题奋斗了一整天。即使是最基本的ORM处理这个问题也比NHibernate优雅得多。我最终不得不完全围绕这个问题进行编码。你和我都肯定错过了一些东西。这不仅仅是这种情况。基本上,任何被引用的实体在被取消引用之前都无法删除。任何引用另一个实体的实体在插入另一个实体之前都无法更新。一些RDBMS允许将约束检查延迟到事务结束,因此这不是一个不合理的问题,也是一个非常有效和常见的场景。更多信息