Cascading en (N) Mise en veille prolongée, quelles règles dois-je besoin?
-
19-09-2019 - |
Question
Désolé si cela est dupe, n'a pas pu trouver, mais ne savait pas vraiment quoi chercher, de toute façon ...
J'ai trois classes, Parent
, Child
et Other
Parent
a beaucoup Child
où l'enfant a une colonne de Parent_Id
Other
contient une référence à un Child
à travers une colonne de Child_Id
Lorsque je supprime un Parent
, je veux aussi supprimer tous les objets associés Child
. Si ces objets Child
sont référencés par toutes les classes de Other
, je veux leur (les objets) Other
références Child_Id
à invalidés.
Quelles sont les règles en cascade ai-je besoin sur les deux relations?
En outre, les entités seront mises à jour de NHibernate en mémoire ainsi que dans la base de données?
i.e.. si j'ai un tas de Parent
, Child
et Other
en mémoire (à savoir db chargé à partir, et non transitoire) et dire NH supprimer un Parent
, ce qui se passera? Je suppose que les objets Parent
et Child
deviendront transitoires? Qu'est-ce qui va arriver à la propriété Child
de tout objet Other
?
Edit: lors de l'utilisation All-delete-orphan, quelles classes d'un objet comme un orphelin? Dans l'exemple ci-dessus, est un Child
orphelin si son Parent
mère est supprimé? Est-ce que la référence de la matière Other
lors de l'examen d'une entité orpheline?
Merci
La solution
NH ne met pas à jour l'un de vos entités en mémoire (à l'exception des Ids et versions). NH n'est pas responsable de gérer les relations de vous entités. Il persiste tout ce que vous avez fait dans la mémoire à la base de données.
De ce point de vue, il devrait être plus facile à comprendre.
cascade="delete"
signifie que lorsque le parent est supprimé, l'enfant est supprimé aussi.
des moyens de cascade="delete-orphan"
, qui en plus, l'enfant est même supprimé si aucune référence parent plus. Ceci, bien sûr, ne fonctionne que si l'enfant est à la session.
L'instance supprimé se transitoires en mémoire. Les références à l'instance transitoire (de Other
) provoquera une exception. Autant que je sache, vous devez supprimer la référence aux instances supprimées par vous-même. Vous pouvez probablement faire implicitement par quelques trucs, mais je doute que ce sera propre. Il est logique d'affaires.
Pour les relations parent-enfant, cascade="all-delete-orphan"
est approprié.
Pour référence régulière, je préfère cascade="none"
.
Il y a un grande explication par Ayende Rahien