2010-04-28 5 views
2

Ayant construit la plupart de mes DAL en utilisant NHibernate, j'ai maintenant découvert que les règles Cascade On Delete de SQL Server doivent aussi être prises en compte dans mes fichiers HBM. J'ai utilisé des sacs pour toutes mes collections, mais il ne semble pas y avoir moyen d'ajouter un attribut cascade = "delete" à un sac. Je peux changer tous mes sacs pour les ensembles, mais cela semble signifier que j'ai changé tous mes IList <> s sur mes modèles à PersistentGenericSet <> s, que je ne ai pas vraiment envie de faire.Hibernate cascade delete sur un sac

Un conseil?

Anthony

Répondre

4

Il y a deux concepts distincts liés mais-: règles en cascade de NHibernate, et en cascade DB.

Ce dernier est en fait configuré sur l'élément key donc, si le FK a ON DELETE CASCADE, c'est ce que le sac devrait ressembler à:

<bag name="Children" ...> 
    <key column="ParentId" on-delete="cascade"/> 
    <one-to-many class="Child"/> 
</bag> 
+0

Cela est correct, mais je tiens à souligner que le paramètre de suppression est utilisé lors de la création du script de base de données à partir de NHibernate. Il va créer une clé étrangère avec une cascade de suppression. Il ne cascade pas les suppressions de vos objets. –

+0

En fait, il modifie le comportement de NHibernate, car il est maintenant conscient de l'existence du comportement * on delete cascade *, donc si vous avez 'cascade =" all "', il utilisera la DB pour le faire au lieu de supprimer objets enfants un par un. –

+0

Juste essayé cela et j'obtiens l'erreur suivante: Seules les associations un-à-plusieurs inverses peuvent utiliser on-delete = "cascade" – littlecharva

2

Vous pouvez ajouter une cascade attribuer à un mappage de sac. Le documentation répertorie plusieurs options pour l'attribut cascade="all|none|save-update|delete|all-delete-orphan". L'option la plus couramment utilisée pour une relation un-à-plusieurs est all-delete-orphan. Définir la cascade à cette valeur entraînera la cascade de toutes les opérations de base de données vers la collection et les objets enfants seront supprimés s'ils sont supprimés de la collection (orphelins).

Les cascades de base de données sont similaires mais n'offrent pas la possibilité de supprimer automatiquement un enregistrement enfant orphelin. La définition de l'option de cascade dans NHibernate et dans la base de données est quelque peu redondante mais peut être utile si d'autres systèmes accèdent directement à la base de données.

Questions connexes