Précédent   Forum du club des développeurs et IT Pro > Dotnet > Accès aux données > Entity Framework
Entity Framework Forum d'entraide sur le développement avec le modèle d'accès aux données Entity Framework de Microsoft.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 08/01/2013, 10h27   #1
Sitting Bull
Membre régulier
 
Homme
Inscription : mai 2003
Messages : 147
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : mai 2003
Messages : 147
Points : 73
Points : 73
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 :
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 :
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 :

Citation:
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"
Sitting Bull est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 11h34   #2
h2s84
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 767
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 28
Localisation : Sénégal

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

Informations forums :
Inscription : mars 2007
Messages : 2 767
Points : 5 256
Points : 5 256
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
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.
__________________
Consultant .Net chez SoftFluent
Découvrir notre produit CodeFluent Entities

Adhérer à l'association Fier d'être développeur
Les FAQs sur les technologies .Net voir ici
Les cours et tutos sur les technologies .Net voir ici
Les critiques sur les livres parlant des technologies .Net voir ici
Pensez à la balise [CODE]
Pensez au tag si votre problème est résolu
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 11h57   #3
Sitting Bull
Membre régulier
 
Homme
Inscription : mai 2003
Messages : 147
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : mai 2003
Messages : 147
Points : 73
Points : 73
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 :
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"
Sitting Bull est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 12h20   #4
h2s84
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 767
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 28
Localisation : Sénégal

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

Informations forums :
Inscription : mars 2007
Messages : 2 767
Points : 5 256
Points : 5 256
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
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 :
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# :
1
2
 
context.Entry(entity).State = EntityState.Detached;
__________________
Consultant .Net chez SoftFluent
Découvrir notre produit CodeFluent Entities

Adhérer à l'association Fier d'être développeur
Les FAQs sur les technologies .Net voir ici
Les cours et tutos sur les technologies .Net voir ici
Les critiques sur les livres parlant des technologies .Net voir ici
Pensez à la balise [CODE]
Pensez au tag si votre problème est résolu
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 18h11   #5
Sitting Bull
Membre régulier
 
Homme
Inscription : mai 2003
Messages : 147
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : mai 2003
Messages : 147
Points : 73
Points : 73
Le code suivant provoque la même erreur :


Code :
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 :
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"
Sitting Bull est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 14h31   #6
Sitting Bull
Membre régulier
 
Homme
Inscription : mai 2003
Messages : 147
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : mai 2003
Messages : 147
Points : 73
Points : 73
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"
Sitting Bull est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h53.


 
 
 
 
Partenaires

Hébergement Web