1

对不起,如果这是一个骗局,找不到它,但真的不知道要搜索什么,无论如何......

我有三个班级ParentChildOther

Parent有很多Child地方孩子有一个Parent_Id专栏

OtherChild通过Child_Id列保存对 a 的引用

当我删除 aParent时,我还想删除所有关联的Child对象。如果这些Child对象被任何Other类引用,我希望它们的(Other对象)Child_Id引用无效。

对于这两种关系,我需要什么级联规则?

此外,NHibernate 会更新内存中的实体以及数据库中的实体吗?

即,如果我有一堆Parent,Child并且Other在内存中(即从数据库加载,而不是瞬态)并告诉 NH 删除 a Parent,会发生什么?我假设ParentandChild对象会变成瞬态的?任何对象的Child属性会发生什么变化?Other

编辑:使用 All-Delete-Orphan 时,哪些对象将对象归类为孤儿?在上面的例子中,如果它的父级被删除,它是Child一个孤儿吗?将实体视为孤儿时Parent,引用是否重要?Other

谢谢

4

1 回答 1

1

NH 不会更新内存中的任何实体(ID 和版本除外)。NH 不负责管理您实体的关系。它只是将您在内存中所做的事情持久化到数据库中。

从这个角度来看,它应该变得更容易理解。

cascade="delete"意味着当父级被删除时,子级也被删除。 cascade="delete-orphan"意味着,另外,如果没有父级再引用它,甚至会删除该子级。当然,这仅在孩子在会话中时才有效。

被删除的实例在内存中是暂时的。对瞬态实例 (from ) 的引用Other将导致异常。AFAIK,您需要自己删除对已删除实例的引用。您可能可以通过一些技巧使其隐含,但我怀疑这将是干净的。这是业务逻辑。

对于亲子关系,cascade="all-delete-orphan"是合适的。

对于常规参考,我更喜欢cascade="none".

Ayende Rahien有一个很好的解释

于 2009-08-24T11:54:56.410 回答