wlad952
Messages postés30Date d'inscriptionmardi 30 mai 2006StatutMembreDernière intervention13 mars 2009
-
17 nov. 2008 à 18:09
RedPaladin
Messages postés1Date d'inscriptionjeudi 26 décembre 2002StatutMembreDernière intervention 9 février 2010
-
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 :)
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();
wlad952
Messages postés30Date d'inscriptionmardi 30 mai 2006StatutMembreDernière intervention13 mars 2009 23 déc. 2008 à 15:25
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
wlad952
Messages postés30Date d'inscriptionmardi 30 mai 2006StatutMembreDernière intervention13 mars 2009 18 nov. 2008 à 09:22
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.
wlad952
Messages postés30Date d'inscriptionmardi 30 mai 2006StatutMembreDernière intervention13 mars 2009 18 nov. 2008 à 09:46
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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
clydislondon
Messages postés3Date d'inscriptionmardi 23 décembre 2008StatutMembreDernière intervention13 mars 2009 23 déc. 2008 à 15:47
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 ?
cs_bellak
Messages postés136Date d'inscriptionjeudi 27 décembre 2007StatutMembreDernière intervention 5 mai 2011 12 mars 2009 à 19:06
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 ??