C# Linq To Entity : Problème d' Ajout/Modification [Résolu]

wlad952 30 Messages postés mardi 30 mai 2006Date d'inscription 13 mars 2009 Dernière intervention - 17 nov. 2008 à 18:09 - Dernière réponse : RedPaladin 1 Messages postés jeudi 26 décembre 2002Date d'inscription 9 février 2010 Dernière intervention
- 9 févr. 2010 à 17:47
Bonsoir à tous ! J'ai un problème au niveau de Linq en C# et je viens de passer ma journée à chercher une solution sans succès. C'est la  raison pour laquelle je me tourne vers ce forum :)

Voilà mon contexte :

J'ai 2 tables qui donnent 2 entities :
Personne(id, nom, idVille (ALLOW NULL))
Ville(id, nom, cp)

Cela génère donc une relation automatique au niveau du diagramme de Classe. Jusque là tout va bien.

Ensuite je propose un formulaire winform à l'utilisateur pour qu'il puisse ajouter une personne et lui rattacher une ville obligatoirement : jusque là tout va bien au niveau objet en mémoire.

C'est là où çà se corse : lorsque je tente d'ajouter la personne à mon contexte cela sort en erreur avec  ce message:

"An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext.  This is not supported."

Et voici le code qui ajoute la personne :

public static int Insert(Person newPerson)
        {
            try
            {
            PartenairesDataClassesDataContext dc = new PartenairesDataClassesDataContext();

         //évite les doublons
                var matched = (from c in dc.Persons
                                         where c.NOM == newPerson.NOM
                                         select c).SingleOrDefault();

                if (matched == null)
                {
                    dc.Persons.InsertOnSubmit(newPerson);
                    dc.SubmitChanges();
                }
                return newPerson.ID;
            }
            catch
            {
                return 0;
            }
        }

Merci pour votre aide.
Afficher la suite 

18 réponses

Répondre au sujet
wlad952 30 Messages postés mardi 30 mai 2006Date d'inscription 13 mars 2009 Dernière intervention - 23 déc. 2008 à 15:25
+3
Utile
En faite le problème vient du fait que j'affectais ma ville à l'utilisateur hors de ma méthode Insert.

Conséquence : LINQ crois que la VILLE ne fait plus partie du même contexte que dans ma méthode Insert et tente donc d'insérer ma Ville qui existe en faite déjà.

La solution : réaffecter la bonne ville du bon contexte avant de faire le "InsertOnSubmit"

Exemple :

public static int Insert(Person newPerson)
        {
            try
            {
            PartenairesDataClassesDataContext dc = new PartenairesDataClassesDataContext();

         //évite les doublons
                var matched = (from c in dc.Persons
                                         where c.NOM == newPerson.NOM
                                         select c).SingleOrDefault();

                if (matched == null)
                {
                        //On va rechercher la ville du même contexte
                        var ville = (from v in dc.VILLEs
                                     where v.ID_VILL == newPerson.VILLE.ID_VILL
                                     select v).Single();
                        newPerson.VILLE = ville; //On réaffecte la ville du bon contexte

                    dc.Persons.InsertOnSubmit(newPerson);
                    dc.SubmitChanges();
                }
                return newPerson.ID;
            }
            catch
            {
                return 0;
            }
        }
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de wlad952
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 17 nov. 2008 à 23:37
0
Utile
Bonsoir,
Le message d'erreur a le mérite d'etre assez clair...

Remplace: dc.Persons.InsertOnSubmit(newPerson);
par: dc.Persons.InsertOnSubmit(new Person());

Ca devrait marcher...

<hr />
-Blog-
-WebSite-
Commenter la réponse de cs_Bidou
wlad952 30 Messages postés mardi 30 mai 2006Date d'inscription 13 mars 2009 Dernière intervention - 18 nov. 2008 à 09:22
0
Utile
Merci pour ta réponse :)

Avant d'essayer, je tiens à signaler que l'insertion telle qu'elle est faite actuellement fonctionne très bien sans l'implémentation de la VILLE pour la personne.

En effet, avant de passer dans le Insert(Person p) j'affecte les propriétés de la personne dont la Ville :

p.VILLE = combobox.SelectedItem as VILLE

Puis j'exécute l'Insert(p).

Mais si je commente l'affectation de la VILLE pour une personne , l'insert fonctionne très bien ! Il y a juste un <NULL> pour l'idVille de la table Personne : normal.

Sur ce je vais essayer ta solution Bidou.
Commenter la réponse de wlad952
wlad952 30 Messages postés mardi 30 mai 2006Date d'inscription 13 mars 2009 Dernière intervention - 18 nov. 2008 à 09:46
0
Utile
Bidou : je viens de regarder ton code plus en "profondeur" : pourquoi insérer une nouvelle instance de Person alors que mon objet que je veux insérer est ma Person newPerson ?
Commenter la réponse de wlad952
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 18 nov. 2008 à 13:09
0
Utile
Euh, me suis trompé, je voulais mettre ceci:
Essayes de faire newPerson.Ville = new Ville();

Si ça marche c'est parce que tu charges ton entité Ville (celle du combo) avec un autre DataContext...

<hr />
-Blog-
-WebSite-
Commenter la réponse de cs_Bidou
clydislondon 3 Messages postés mardi 23 décembre 2008Date d'inscription 13 mars 2009 Dernière intervention - 23 déc. 2008 à 15:00
0
Utile
Comment as tu finalement résolu ou contourné ce soucis ?

Merci d'avance
Commenter la réponse de clydislondon
wlad952 30 Messages postés mardi 30 mai 2006Date d'inscription 13 mars 2009 Dernière intervention - 23 déc. 2008 à 15:26
0
Utile
A toi d'adapter ;)
Commenter la réponse de wlad952
clydislondon 3 Messages postés mardi 23 décembre 2008Date d'inscription 13 mars 2009 Dernière intervention - 23 déc. 2008 à 15:47
0
Utile
Merci
Cela fonctionne effectivement

C'est une bonne solution pour contourner le problème
mais imaginons que j'ai 1000 propriétés comme Ville, cela voudrait dire qu'il faudrait les réassigner une à une avant de faire notre Insert ?

Je pense qu'il doit exister une manière plus 'propre' de résoudre cette problématique, non ?
Commenter la réponse de clydislondon
wlad952 30 Messages postés mardi 30 mai 2006Date d'inscription 13 mars 2009 Dernière intervention - 23 déc. 2008 à 16:36
0
Utile
Effectivement oui il doit exister un moyen ...

Sinon en affectant toutes tes villes juste avant l'insert ? Ou encore utiliser le même DataContext en static dans toute tes méthodes ?
Commenter la réponse de wlad952
cs_bellak 136 Messages postés jeudi 27 décembre 2007Date d'inscription 5 mai 2011 Dernière intervention - 12 mars 2009 à 12:16
0
Utile
Salut , pardon mais est ce que c'est du LinqToEntities que vous faites ??
Commenter la réponse de cs_bellak
wlad952 30 Messages postés mardi 30 mai 2006Date d'inscription 13 mars 2009 Dernière intervention - 12 mars 2009 à 14:04
0
Utile
Oui me semble-t-il ?
Commenter la réponse de wlad952
cs_bellak 136 Messages postés jeudi 27 décembre 2007Date d'inscription 5 mai 2011 Dernière intervention - 12 mars 2009 à 19:06
0
Utile
non , parceque chez moi je vois les proprités SubmitChanges(), InsertOnSubmit(newPerson)... j'ai AddToObject et SaveChanges . ce que vous faites c'est du LTS , non ??
Commenter la réponse de cs_bellak
wlad952 30 Messages postés mardi 30 mai 2006Date d'inscription 13 mars 2009 Dernière intervention - 13 mars 2009 à 09:28
0
Utile
Non ce n'ai pas du LTS (d'ailleurs qu'es ce que le LTS ?)

C'est bien de la technologie LINQ de .NET 3.5 dont on parle ;)
Commenter la réponse de wlad952
clydislondon 3 Messages postés mardi 23 décembre 2008Date d'inscription 13 mars 2009 Dernière intervention - 13 mars 2009 à 09:56
0
Utile
pour ma part il s'agit bien de linqToSql
je ne me suis pas encore servi de linqToEntity, qui est voué à remplacer linqToSql si j'ai bien compris
Commenter la réponse de clydislondon
cs_bellak 136 Messages postés jeudi 27 décembre 2007Date d'inscription 5 mai 2011 Dernière intervention - 13 mars 2009 à 12:24
0
Utile
LTS : c'est LinqToSql . j'ai petit problème sur LinqToEntities , je peux pas ajouter des entités
Commenter la réponse de cs_bellak
wlad952 30 Messages postés mardi 30 mai 2006Date d'inscription 13 mars 2009 Dernière intervention - 13 mars 2009 à 14:20
0
Utile
C'est bien du LinqToSql (class)  que j'utilise (fichier .dbml)
Commenter la réponse de wlad952
cs_bellak 136 Messages postés jeudi 27 décembre 2007Date d'inscription 5 mai 2011 Dernière intervention - 13 mars 2009 à 14:57
0
Utile
si tu veux utiliser du LinqToEntities tu dois utiliser une classe ADO.NET EDM (.edmx)
Commenter la réponse de cs_bellak
RedPaladin 1 Messages postés jeudi 26 décembre 2002Date d'inscription 9 février 2010 Dernière intervention - 9 févr. 2010 à 17:47
0
Utile
[^^sad1][^^sad1][^^sad1][^^sad1][^^sad1][^^sad1][^^sad1][^^sad1][^^sad1][^^sad1][^^sad1][^^sad1][^^sad1]
Commenter la réponse de RedPaladin

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.