Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Membre éclairé
    Homme Profil pro Christian FINEL
    Développeur .NET
    Inscrit en
    avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Nom : Homme Christian FINEL
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : avril 2004
    Messages : 265
    Points : 306
    Points
    306

    Par défaut [C#][NHibernate] Cascade update/delete

    Bonjour,

    J'ai besoin de configurer NHibernate de manière à ce que la suppression de l'élément parent dans une relation OneToMany ne supprime pas la partie enfant, un petit schéma :

    EntitéParent 1 ---- n EntitéEnfantCollection

    J'ai déjà exclut cascade="all-delete-orphan" - j'ai tenté cascade="save-update', sans résultat.

    Quelqu'un a déjà eu ce problème ?

  2. #2
    Membre Expert
    Inscrit en
    février 2005
    Messages
    1 243
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 1 243
    Points : 1 856
    Points
    1 856

    Par défaut

    En dehors du fait qu'il faut aussi contrôler la maniére dont cette relation est matérialisées dans la base,

    Je ne suis pas certain de comprendre l'objectif :

    Je comprends que si tu a un objet parent qui a une collection d'enfant, si tu supprimes l'enfant, tu ne veux pas supprimer le parent ?

    Les modes de fonctionnement sont les suivants :
    none
    Aucune action effectuée, c'est à "toi" de gérer le nettoyage de l'association manuellement
    save-update
    chaque élément de l'association est contrôlé et sauvé ou updaté si nécessaire.
    delete
    La suppression du parent entraine la suppression des objets associés.
    delete-orphan
    La suppression du parent entraine la suppression des objets associés.
    Un objet supprimé de la collection qui n'est plus rattaché à un parent sera supprimé (orphelin)
    all
    Itére toute l'association et applique les modifications à la collection.
    all-delete-orphan
    Comme all, plus supprime les éléments de la collection orphelins

    Globalement ce que tu souhaites semble être none, ce qui veut cependant dire dans ton cas que tu n'as pas d'intégrité relationnelle dans ta base sur cette relation, puisqu'il peut exister des éléments enfants orphelins.

    Ou éventuellement all, en fonction de la contrainte qui fera une mise à jour de la collection sans traiter les orphelins (donc les éléments détachés du parent).


    Mais si tu avais un bout de code et de mapping, je t'aidera mieux probablement.

  3. #3
    Membre éclairé
    Homme Profil pro Christian FINEL
    Développeur .NET
    Inscrit en
    avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Nom : Homme Christian FINEL
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : avril 2004
    Messages : 265
    Points : 306
    Points
    306

    Par défaut

    Alors en fait c'est exactement l'inverse ^^. Je précise :

    ObjetParent 1 -- n ObjetsEnfant n -- 1 AutreObject

    Je veux supprime l'objet ObjectParent sans supprimer ObjetEnfant car sinon je perds des données.

    La solution :
    - Modifier la contrainte Foreign key (SQL Server 2008) avec ON UPDATE SET NULL. On modifiera la colonne contenant la clé étrangère avec un DEFAULT NULL.

    - Modifier le mapping de la collection enfant dans ObjectParent : on place l'attribut cascade à save-update et inverse à true.

    Avec cette configuration, lors de la suppression d'une instance d'ObjetParent, les clés étrangères associés sont placées à NULL.

    Je passe le topic à résolu .

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •