gpt4 book ai didi

nhibernate - 为什么 NHibernate 不先删除孤儿呢?

转载 作者:行者123 更新时间:2023-12-02 11:28:23 24 4
gpt4 key购买 nike

我试图找出原因 NHibernate像它一样处理一对多级联(使用cascade=all-delete-orphan)。我遇到了和这个人同样的问题:

Forcing NHibernate to cascade delete before inserts

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

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

最佳答案

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

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

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

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

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

此外,由于 nHibernate 是基于 Hibernate 的,因此我研究了 Hibernate,发现有几个人在谈论同样的问题。

这是他们的最佳答案:

Gail Badner added a comment - 21/Feb/08 2:30 PM: The problem arises when a new association entity with a generated ID is added to the collection. The first step, when merging an entity containing this collection, is to cascade save the new association entity. The cascade must occur before other changes to the collection. Because the unique key for this new association entity is the same as an entity that is already persisted, a ConstraintViolationException is thrown. This is expected behavior.

关于nhibernate - 为什么 NHibernate 不先删除孤儿呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3859036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com