IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linq Discussion :

Foreign Key et suppression de données


Sujet :

Linq

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 62
    Points
    62
    Par défaut Foreign Key et suppression de données
    Bonjour,

    J'ai dans ma base de données 2 tables, reliées entre elles par un foreign key. Soit la table A ayant un id_B devant être compris dans les entrées de la table B.

    Dans mon application, j'ai une fonction qui doit supprimer des entrées dans la table B. Hors cela peut provoquer des exceptions (car on supprime des entrées utilisées par la FK de la table A).

    En regardant l'exception levée, j'ai donc pu implémenter un try catch avec récupération de l'exception SqlException.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    try
    {
    	var monEntreeB = (from b in db.tableB
    			  where b.ID.Equals(monID)
    			  select b).FirstOrDefault();
    	db.campus.DeleteOnSubmit(monEntreeB);
     
    	db.SubmitChanges();
    }
    catch (System.Data.SqlClient.SqlException sqlException)
    {
    	MessageBox.Show("une erreur sqlException a été levée");
    }
    Ce qui fonctionne dans un premier temps, car si je supprime une entrée valide (non liée par la FK), tout fonctionne et si je supprime une entrée non valide, l'exception est gérée.

    Le problème est que si je commence par supprimer une entrée non valide et qui lève l'exception, après, peut importe si je supprime une entrée valide ou non, l'exception est toujours levée.

    Savez vous pourquoi?

    Une première idée serait que le DeleteOnSubmit() n'est pas annulé lorsque le SubmitChanges() échoue, mais je ne sais pas comment l'annuler (un Rollback en LINQ?).

    Merci d'avance!

  2. #2
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Savez vous pourquoi?
    C'est liée à ton DataContext tout simplement (db). Il faut savoir que celui ci fait un tracking de tous les changements (update, delete et insert). Grâce à cela, lorsque tu lui demandes d'exécuter les changements en base de données avec SubmitChanges, il sait ce qu'il doit faire.

    Donc dans ton cas, la première fois qu'il essaye de supprimer une entrée B "non valide", il sait qu'il doit essayer de faire une suppression. Par contre la seconde fois que tu essayes de supprimer une entrée B, cette fois-ci "valide", ça ne fonctionnera pas car le DataContext se rappelle qu'il a toujours la première suppression à effectuer.

    Tu vois ce que je veux dire ?

    Une solution serait d'instancier un nouveau DataContext à chaque appel de ta méthode, ça aura pour but de repartir avec un tracking vide.

    Par contre, c'est voulu d'interdire la suppression d'objets B considérés comme "invalides" ?

    Tu peux pas retirer la clé étrangère en question dans les entrées A ?

    Un code de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    try
    {
        var mesEntreesA = from a in db.TableA
                  where a.FKB.Equals(monID)
                  select a;
        foreach(var entreeA in mesEntreesA)
        {
            entreeA.FKB = null; // Vu que ce sont des instances provenant du DataContext (db), dès que la ligne est exécutée, le DataContext sait qu'il faudra faire un update au prochaine SubmitChanges
        }
     
        var monEntreeB = (from b in db.tableB
                  where b.ID.Equals(monID)
                  select b).FirstOrDefault();
        db.campus.DeleteOnSubmit(monEntreeB);
     
        db.SubmitChanges();
    }
    catch (System.Data.SqlClient.SqlException sqlException)
    {
        MessageBox.Show("une erreur sqlException a été levée");
    }

    tu peux aussi connaître les opérations Insert, Update et Delete en attente sur une DataContext en appelant la méthode GetChangeSet().
    Jérôme Lambert
    Développeur, Architecte, Rédacteur & Fan technologies Microsoft
    Ma boite informatique | Mon profil LinkedIn

  3. #3
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Y'a pas de méthode CancelChanges ?

    EDIT : Ah ben non mais par contre tu pourrais appeler la méthode Refresh en lui passant RefreshMode.OverwriteCurrentValues (si j'ai bien compris).

    Ou sinon tu utilises la méthode de Jérôme.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  4. #4
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Citation Envoyé par Skyounet Voir le message
    EDIT : Ah ben non mais par contre tu pourrais appeler la méthode Refresh en lui passant RefreshMode.OverwriteCurrentValues (si j'ai bien compris).
    Je ne suis pas sûr que refresh permette d'annuler les insert et delete. L'appel à cette méthode n'est utile que pour annuler les update.
    Jérôme Lambert
    Développeur, Architecte, Rédacteur & Fan technologies Microsoft
    Ma boite informatique | Mon profil LinkedIn

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    Pour la foreign key, oui c'est voulu. Je ne veux pas d'objets A orphelins, et encore moins supprimer des données involontairement lorsqu'on supprime une entrée de B

    En passant par une nouvelle instance de mon DataContext ça marche déjà mieux. Jusqu'ici j'avais un DataContext commun à toute la fenêtre .

    Pour le refresh, effectivement ça ne fonctionne pas pour les deletes. C'est dommage qu'on ne puisse pas faire de CancelChanges.

    En tout cas merci, ça à résolu mon problème

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/07/2009, 15h55
  2. Foreign Key avec "filtre données"
    Par plalm dans le forum Oracle
    Réponses: 0
    Dernier message: 01/05/2008, 09h11
  3. Réponses: 1
    Dernier message: 19/07/2007, 14h53
  4. Liste des foreign key des tables d'une base de données
    Par lalyly dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/05/2006, 11h25
  5. suppression d'une foreign key
    Par GMI dans le forum InterBase
    Réponses: 7
    Dernier message: 01/02/2005, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo