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

Entity Framework Discussion :

EF4 => Delete plusieurs lignes


Sujet :

Entity Framework

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 25
    Points
    25
    Par défaut EF4 => Delete plusieurs lignes
    Bonjour à tous,

    dans mon application je dois supprimer les lignes existantes dans une table avant d'enregistrer les nouvelles lignes

    Mais avec une requête linq to SQL, jene peux pas faire de Delete en masse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var reqDelete = from p in ContexteDAO.ContexteDonnees.TH_RESULTATS
                               where (DateTime)p.DATE_ARRETE == DtDA && p.ENTITE_CALCUL.Equals(_EC)
                                select p;
    foreach (var item in reqDelete)
                {
                    ContexteDAO.ContexteDonnees.TH_RESULTATS.DeleteObject(item);
     
                }
                ContexteDAO.ContexteDonnees.SaveChanges();
                ContexteDAO.Enregistrer();
    Ceci fonctionne correctement mais quand on a 1000 lignes c'est très loooong

    Une autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ContexteDAO.ContexteDonnees.ExecuteStoreCommand("DELETE FROM TH_RESULTATS WHERE ENTITE_CALCUL='" + _EC + "' AND  DATE_ARRETE=TO_DATE('" + _DA.Substring(0, 10).ToString() + "','DD/MM/YYYY')");
                ContexteDAO.ContexteDonnees.SaveChanges();
                ContexteDAO.Enregistrer();

    MAis voila bien que la deuxième solution soit bcp plus rapide, j'ai une erreur lors de l'insertion de données plus tard dans cette table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    TH_RESULTATS cnew = new TH_RESULTATS 
                    { 
                        SEQUENCE_RESULTAT=compteur,
                        ENTITE_CALCUL=item.ENTITE_CALCUL,
                        DATE_ARRETE=item.DATE_ARRETE,
                    };
                    compteur += 1;
                    ContexteDAO.ContexteDonnees.TH_RESULTATS.AddObject(cnew);
                    ContexteDAO.ContexteDonnees.SaveChanges();
    Message d'erreur :

    Les modifications apportées à la base de données ont été validées, mais une erreur s'est produite lors de la mise à jour du contexte de l'objet. ObjectContext est peut-être dans un état incohérent. Message d'exception interne : AcceptChanges ne peut pas continuer, car les valeurs de clés de l'objet sont en conflit avec un autre objet dans ObjectStateManager. Assurez-vous que les valeurs de clés sont uniques avant d'appeler AcceptChanges.
    J'ai l'impression que je force le delete avec ma requête mais que l'EF n'a pas pris en compte ces modifications.

    Que faut-il faire pour garder la solution de suppression en masse?
    Comment mettre à jour l'EF?

    Merci bcp

    Bonne journée

  2. #2
    Invité
    Invité(e)
    Par défaut
    Je ne comprend pas trop mais en globalement il s'agit d'un problème lié à des clefs primaires dupliqués. à ce que je vois tu généres manuellement la clef ce qui n'est pas une bonne pratique alors je te conseille de laisser le SGBDR auto-généré cette clef et voir ce que ça donne.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Salut H2s84

    Merci pour ton aide
    Malheureusement je ne peux pas changer la manière dont est générée la clé primaire. (d'autres applications accèdent et modifient cette table)

    De plus c'est une base oracle donc pas d'auto incrément

    Quand je vérifie mon code, les données sont bien supprimées.
    si je fais une requete pour récupérer ma clé primaire, elle est bien à 0 (plus de ligne)

    Quand je fais mon insert, les données sont bien enregistrées dans la base.
    Par contre, à la fin j'ai le droit à ce message d'erreur qui bien sur fait planter l'application ...

    J'ai consulté les sites internet et je ne suis pas le seul à rencontrer ce problème mais je n'ai trouvé aucune solution

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    La solution que j'ai trouvé est la suivante :

    si j'ai 70 lignes dans ma table par exemple,

    je vérifie le compteur avant le delete
    puis quand j'insère de nouveau je repars de 71 ...
    et la aucun pb.

    C'est donc au niveau de mon entity framework que j'ai un pb.
    je ne vois pas comment faire un update de mon entity après mon delete

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mickeybond Voir le message
    si j'ai 70 lignes dans ma table par exemple,

    je vérifie le compteur avant le delete
    puis quand j'insère de nouveau je repars de 71 ...
    et la aucun pb.
    Heu... Ceci n'est pas une bonne pratique (Quand je vois chef de projet SSII je me dis que.. heu... )
    Utilise l'auto-incrémentation c'est la méthode la plus adaptée et recommandée.

    Citation Envoyé par mickeybond Voir le message
    C'est donc au niveau de mon entity framework que j'ai un pb.
    je ne vois pas comment faire un update de mon entity après mon delete
    Tu as deux solutions :
    • soit utilisé la suppression en cascade au niveau de ton SGBDR
    • soit utilisé la suppression en cascade au niveau de ton EF dans ce cas tous tes objets enfants doivent être en mémoire au moment de la suppression de la l'objet (avec la clef primaire)

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    tu as la proprité refresh au niveau de ton context qui permet de mettre à jour une entité à partir de la BDD

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Heu... Ceci n'est pas une bonne pratique (Quand je vois chef de projet SSII je me dis que.. heu... )
    Utilise l'auto-incrémentation c'est la méthode la plus adaptée et recommandée.
    Bonjour H2s84 :
    1°- Je n'ai jamais dit que c'était la méthode que j'allais utiliser, je fais des tests afin de trouver d'ou vient le pb.
    2°- J'ai demandé de l'aide pas une remarque désobligeante sur ma fonction ou mes capacités. Surtout quand on ne connait pas l'historique : je suis sur une mission en Oracle, WPF , MVVM, EF, tout ceci m'était inconnuil y a 2 mois et je n'ai eu comme aide que 2 bouquins et les sites internet comme celui-ci.

    Merci de ton aide

    cdt

  8. #8
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    si j'ai 70 lignes dans ma table par exemple,

    je vérifie le compteur avant le delete
    puis quand j'insère de nouveau je repars de 71 ...
    et la aucun pb.
    Que ce passe t'il si deux personnes utilises ton code en même temps?
    En fait ce n'était pas une question je connais la réponse.
    C'est une mauvaise pratique, rien ne t'assure qu'entre le moment ou tu détermine l'actuel id max de ta table et le moment ou tu commences à insérer quelqu'un n'ai pas de son côté inséré de nouveaux enregistrements dans ta table...


    Rien ne vaut une procédure stockée avec le niveau d'isolation adéquat...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  9. #9
    Membre chevronné
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Points : 1 839
    Points
    1 839
    Billets dans le blog
    2
    Par défaut
    Est-ce que cette table à des liaisons avec d'autres tables dans ton SGBD (cléfs étrangère)...
    J'ai remarqué que quand c'est le cas et que ton SGBD fais des delete en cascade de son côté, l'EF génère une erreur car pour lui seul la première table a été modifié, et il ne comprend pas pourquoi d'autre tables ont été modifié.
    Pour évité ce genre de problème, je vais dans la BDD et sur chaque liaison intertable je dis de ne rien faire sur delete. Puis dans mon modele edmx, je fais les delete en cascade (dans propriété de la liaison).

    Sinon, tu peux essayer de détruire ton conteneur d'entité et le recréé derière.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim LesDatas As New ReqEntities
    ... Delete
    LesDatas = nothing
    LesDatas = New ReqEntities
    Si débugger est l'art d'enlever les bugs ... alors programmer est l'art de les créer

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Merci de votre aide

    Je vais mettre à jour mes liaisons

  11. #11
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    La meilleure manière surtout en terme de performance est cependant de ne pas utiliser LINQ TO SQL/ENTITIES pour les opérations d'INSERT/UPDATE/DELETE particulièrement si ceux-ci sont multiples.
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  12. #12
    darthmower
    Invité(e)
    Par défaut
    Avec Oracle tu n'as pas d'auto-incremente mais tu as les sequence:
    http://www.techonthenet.com/oracle/sequences.php

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

Discussions similaires

  1. trigger delete pour plusieurs lignes
    Par Shabata dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/09/2009, 02h00
  2. Réponses: 2
    Dernier message: 10/05/2004, 08h55
  3. TDBGrid - Un enregistrement sur plusieurs lignes
    Par BRODU dans le forum Bases de données
    Réponses: 2
    Dernier message: 09/05/2004, 08h53
  4. Réponses: 14
    Dernier message: 09/04/2004, 14h44
  5. Define sur plusieurs lignes
    Par Gogoye dans le forum C
    Réponses: 6
    Dernier message: 06/10/2003, 12h45

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