Nhibernate 为什么';先删除孤儿吗?
我试图弄明白为什么要用这种方式处理一对多级联(使用cascade=all-delete-orphan)。我遇到了和这家伙一样的问题: 据我所知,NHibernate总是先执行插入,然后更新,然后删除。这可能有一个很好的理由,但我一辈子都搞不清楚原因是什么。我希望更好地理解这一点能帮助我想出一个我并不讨厌的解决方案:)Nhibernate 为什么';先删除孤儿吗?,nhibernate,Nhibernate,我试图弄明白为什么要用这种方式处理一对多级联(使用cascade=all-delete-orphan)。我遇到了和这家伙一样的问题: 据我所知,NHibernate总是先执行插入,然后更新,然后删除。这可能有一个很好的理由,但我一辈子都搞不清楚原因是什么。我希望更好地理解这一点能帮助我想出一个我并不讨厌的解决方案:) 关于这种行为有什么好的理论吗?在什么情况下,首先删除孤儿不起作用?所有的ORM都是这样工作的吗?编辑:在说没有理由之后,这里有一个理由。 假设您有以下场景: public cla
关于这种行为有什么好的理论吗?在什么情况下,首先删除孤儿不起作用?所有的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进行了研究,发现有几个人在谈论同一个问题
我只是想给这个问题增加我的挫折感。在这种情况下,NHibernate是一个绝对的失败。我已经为这个愚蠢的问题奋斗了一整天。即使是最基本的ORM处理这个问题也比NHibernate优雅得多。我最终不得不完全围绕这个问题进行编码。你和我都肯定错过了一些东西。这不仅仅是这种情况。基本上,任何被引用的实体在被取消引用之前都无法删除。任何引用另一个实体的实体在插入另一个实体之前都无法更新。一些RDBMS允许将约束检查延迟到事务结束,因此这不是一个不合理的问题,也是一个非常有效和常见的场景。更多信息