Question

Cela doit être une question fréquente, mais pas encore sur SO, semble-t-il. J'utilise Linq to SQL pour une application qui autorise diverses modifications de données dans mon modèle en mémoire. Les modifications sont ensuite placées dans une file d'attente pour le traitement asynchrone. Donc, je ne suis pas inquiet pour les mises à jour (pour le moment). Les modifications apportées à diverses parties des données peuvent être effectuées via des fenêtres contextuelles modales sur la page Web. Certains sont basés sur une grille, d'autres ne sont que des attributs. Je rencontre un problème avec des modifications qui ne survivent pas aux cycles de postback. Bien entendu, je ne souhaite rien conserver dans la base de données tant que toutes les modifications n'ont pas été apportées et que l'utilisateur n'a pas soumis la page.

L'itinéraire que j'ai choisi jusqu'à présent est le suivant:

  • J'ai désactivé le chargement différé
  • Je crée une classe partielle [sérialisable] pour mon objet racine
  • Je mets la chose dans la session et la récupère dans l'événement onload

Cela semble fonctionner en principe. Cependant, lorsque j'essaie de mettre à jour certaines propriétés de l'enfant après avoir récupéré l'objet de la session

p.PhysicianSpecialties[0].physician_specialty_code = 
    ddlSpecialty.SelectedItem.Value;

Je reçois cette erreur:

Operation is not valid due to the current state of the object.

L'erreur est provoquée par cet appel de méthode dans la méthode de définition Linq générée:

this.SendPropertyChanging();

Les autres propriétés sont mises à jour correctement:

p.PhysicianNames[0].first_name = txtFirstName.Text.ToUpper();

Cela ne provoque pas d'erreur.

Mes questions: suis-je fondamentalement sur la mauvaise voie? Existe-t-il une meilleure façon de le faire? Qu'est-ce qui cause l'erreur?

Mise à jour: L'exception est 'System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException'. Je pense Je suis sur quelque chose , mais je ne connais pas encore la solution.

Était-ce utile?

La solution

J'ai reçu la solution de MSDN. La question est, et il est expliqué mieux dans ce fil que je ne peux le faire, il est impossible de changer une association de façon unilatérale, mais il faut le faire aux deux extrémités, en assignant un nouvel objet enfant, et pas seulement en changeant l'identifiant:

p.PhysicianSpecialties [0] .PhysicianSpecialtyLookup =     db.PhysicianSpecialtyLookups.Single (c = >     (c.physician_specialty_code == ddlSpecialty.SelectedItem.Value));

Autres conseils

Et comment s'y prend-on si on utilise la liaison de données? J'ai une liste déroulante dans une vue de grille de données qui a commencé à générer cette erreur lorsque je modifie la valeur de la liste déroulante. Cela me fait penser que je dois supprimer l'association ou ne pas utiliser la liaison de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top