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 :

EF5 : Erreur pendant l'insertion des données


Sujet :

Entity Framework

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2003
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2003
    Messages : 147
    Points : 109
    Points
    109
    Par défaut EF5 : Erreur pendant l'insertion des données
    Visual Studio 2012
    Entity Framework 5
    SQL Compact 4.0


    Bonjour,

    Mon problème est le suivant, après avoir effectué une opération de suppression par la méthode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Context.Database.ExecuteSqlCommand(string.Format("DELETE FROM {0}", tablename));
    Il m’est alors impossible d’insérer des enregistrements dans cette même table via la méthode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void AddIndividus ( List<Individus> individus )
            {
                foreach (Individus individu in individus) {
                    dataContext.ChristContext.Individus.Add(individu);                
                }
                dataContext.ChristContext.SaveChanges();
     
            }
    Cette dernière provoque systématiquement l’erreur :

    Exception: 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’object.
    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 tout d’abord vérifié l’intégrité des données et je n’ai pas de problème de clé primaire, ce dernier est bien unique.
    De plus, lorsque j’effectue cette opération en 2 temps, je supprimer, je ferme l’application, j’insère les enregistrements tout fonctionne correctement.

    Je débute dans l’utilisation de l’Entity Framework, mais cela ressemble fortement à un problème de rafraîchissement de mes objets.

    En vous remerciant par avance de votre aide.
    Les deux mots les plus brefs et les plus anciens, oui et non, sont ceux qui exigent le plus de réflexion. "Pythagore"

  2. #2
    Invité
    Invité(e)
    Par défaut
    Ton problème se déclenche parce que tout simplement tu effectues les opérations suivantes :
    1. tu charges des instances de la classe Individu et le traking de celles-ci sont effectuées par ton contexte EF
    2. ensuite tu utilises une commande SQL pour supprimer toute les données de ta table Individu sauf que cette commande ne met pas à jour le contexte EF en supprimant les instances correspondant aux lignes supprimées dans ta base.
    3. enfin tu essaies d'ajouter de nouvelles instances dans ton contexte sauf que tu oublies que certaines instances seront en conflit avec celles que tu as chargées dans l'étape 1.


    Bref cela n'est pas du tout une bonne pratique, la seule solution qui n'est pas aussi une bonne pratique c'est qu'après avoir exécuté ta commande pour vider la table tu détaches de ton contexte toutes les instances en rapport avec l'entité mappée à la table dont les lignes ont été supprimées.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2003
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2003
    Messages : 147
    Points : 109
    Points
    109
    Par défaut
    Merci pour ta réponse.
    En effet je comprends mieux le principe. Toutefois, cela m’amène à une question

    Si ce n'est pas une bonne pratique, quelle est la bonne pratique pour supprimer massivement le contenu d'une table (pas de procédure stockée dans SQL compact) ?


    J'ai bien essayé la méthode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var tables = from id in Context.Individus                        
                            select id;            
                foreach(Individus table in tables) {
                    Context.Individus.Remove(table);
                }            
                Context.SaveChanges();
    Mais cela ne change en rien à mon problème.


    Après je débute avec l'EF5, et je ne vois pas comment détacher un entity de mon context (pas de fonction detach dans l'EF5 ????) du coup je n'arrive pas à tester ta solution qui me semble être la bonne.
    Les deux mots les plus brefs et les plus anciens, oui et non, sont ceux qui exigent le plus de réflexion. "Pythagore"

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Sitting Bull Voir le message
    Si ce n'est pas une bonne pratique, quelle est la bonne pratique pour supprimer massivement le contenu d'une table (pas de procédure stockée dans SQL compact) ?
    Ha ! Ok je vois.

    Citation Envoyé par Sitting Bull Voir le message
    J'ai bien essayé la méthode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var tables = from id in Context.Individus                        
                            select id;            
                foreach(Individus table in tables) {
                    Context.Individus.Remove(table);
                }            
                Context.SaveChanges();
    Mais cela ne change en rien à mon problème.
    T'as quoi comme erreur ?
    Pour plus de simplicité tu peux utiliser la méthode d'extension Delete fournie par cette librairie installable via nuget Install-Package EntityFramework.Extended
    Citation Envoyé par Sitting Bull Voir le message
    Après je débute avec l'EF5, et je ne vois pas comment détacher un entity de mon context (pas de fonction detach dans l'EF5 ????) du coup je n'arrive pas à tester ta solution qui me semble être la bonne.
    Pour détacher un objet du contexte voici la méthode à suivre :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    context.Entry(entity).State = EntityState.Detached;

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2003
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2003
    Messages : 147
    Points : 109
    Points
    109
    Par défaut
    Le code suivant provoque la même erreur :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var tables = from id in Context.Individus                        
                            select id;            
                foreach(Individus table in tables) {
                    Context.Individus.Remove(table);
                }            
                Context.SaveChanges();

    J'ai essayé de détacher également mon objet en rajoutant le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var tables = from id in Context.Individus                        
                            select id;            
                foreach(Individus table in tables) {
                    Context.Individus.Remove(table);
                    Context.SaveChanges();
                    Context.Entry(table).State = EntityState.Detached;
                }            
                Context.SaveChanges();
    Mais le résultat est toujours identique.


    Je "pense" comprendre le fait que les lignes supprimés sont toujours présentes dans le contexte mais je pensais que le fait de passer par la fonction Remove() qui dépend du contexte permettrait de contourner ce problème...

    Il y a obligatoirement une énorme boulette dans mon code, mais difficile de mettre la main dessus.
    Les deux mots les plus brefs et les plus anciens, oui et non, sont ceux qui exigent le plus de réflexion. "Pythagore"

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2003
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2003
    Messages : 147
    Points : 109
    Points
    109
    Par défaut
    Je viens de trouver mon erreur.
    Je ne suis pas certain d'être très clair dans mes explications mais je vais néanmoins essayer.

    Premièrement mon architecture contient une DAL et une BLL.

    Lorsque j’appelle directement la fonction de suppression depuis ma DAL (IndividusDAO.DeleteAll()) je me retrouve avec une exception.
    Du coup j'ai créé dans ma BLL la fonction DeleteAll (ce que je comptais faire par la suite) et lorsque j’appelle cette dernière, adieu cette maudite exception.

    En gros j’ai créé 2 instances de ma classe IndividusDAO, l’une pour la suppression et l’autre pour mon insertion…. Je pensais éviter ce genre de problème avec la mise en place de Singleton mais du coup c’est le développeur qui faut changer

    Encore merci pour l’aide
    Bonne continuation
    CB
    Les deux mots les plus brefs et les plus anciens, oui et non, sont ceux qui exigent le plus de réflexion. "Pythagore"

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

Discussions similaires

  1. [AC-2007] erreur lors de l'insertion des données
    Par bamoussa dans le forum VBA Access
    Réponses: 1
    Dernier message: 25/10/2012, 23h09
  2. [MySQL] erreur lors de l'insertion des données
    Par bamoussa dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 11/06/2012, 02h02
  3. [C#] problème avec l'insertion des données dans MySQL
    Par madica dans le forum Accès aux données
    Réponses: 7
    Dernier message: 08/11/2005, 13h27
  4. Réponses: 2
    Dernier message: 15/09/2005, 15h08
  5. Réponses: 6
    Dernier message: 02/06/2005, 12h44

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