2010-10-05 13 views
1

Voici le scénario:LINQ - comment faire fonctionner le suivi des changements quand l'entité est passé à une autre classe que la propriété

J'ai un contrôle utilisateur ASP.NET qui exécute une requête LINQ, stocke les résultats dans une liste générique, puis charge dynamiquement un autre contrôle utilisateur (dans un espace réservé) et transmet l'un des objets de la liste au contrôle via une propriété du contrôle.

La commande enfant affiche les données de l'objet et permet à l'utilisateur de modifier différents champs. Un bouton Enregistrer sur le contrôle parent appelle une méthode "SaveInput" sur le contrôle enfant qui met à jour les propriétés de l'objet à partir des données entrées (aucun DataContext n'a été créé à ce stade).

Le problème est que je n'arrive pas à utiliser la méthode SubmitChanges de DataContext pour enregistrer l'objet mis à jour. Voici ce que j'ai essayé:

  • Si j'appelle SubmitChanges du contrôle parent, il ne reconnaît pas qu'il ya des changements pour sauver, même si lorsque vous examinez l'objet original (liste de contrôle parent) il a clairement obtenu de nouvelles valeurs de propriété. Je suppose que cela est dû au fait que les modifications n'ont pas été effectuées via le DataContext du contrôle parent.

  • Si j'essaie (dans le code du contrôle parent) d'attacher l'objet au DataContext, j'obtiens une erreur qu'il est déjà attaché (eh bien c'est, tellement juste).

  • Si je crée un DataContext (dans le code de contrôle enfant) puis essayez d'attacher l'objet, je reçois une erreur qu'il est déjà attaché à un autre DataContext (encore une fois, cela est vrai)

Donc ma solution maladroite est de créer un DataContext (dans le code du contrôle enfant) puis de créer une nouvelle instance du type de l'objet, puis de définir chaque propriété sur cet objet à partir de l'équivalent sur l'objet altéré, puis SubmitChanges. Pas élégant, mais ça marche.

Y a-t-il un meilleur moyen?

+0

Balise linq-to-sql supprimée. Ce n'est pas la même chose que LINQ – Nobody

Répondre

1

Je recommande à nouveau tirer le dossier exact de votre nouveau DataContext quelque chose comme

ctxt.Table.Where(x => x.ID == recordYouHave.ID).FirstOrDefault() 

Et puis enregistrez les modifications apportées à ce dossier avant d'appeler « SubmitChanges ».

L'autre solution consiste à conserver le contexte que vous avez utilisé pour récupérer l'enregistrement original, mais Vous ne voulez pas faire cela! Chaque contexte devrait être de courte durée. Cependant, j'aurais dû mentionner que vous pouvez attacher une entité à un nouveau contexte, mais vous devez ressaisir l'enregistrement original pour qu'il n'enregistre pas un autre appel de base de données. Vous n'avez pas besoin d'affecter les propriétés de l'objet:

var orig = ctxt.Table.Where(x => x.ID == recordYouHave.ID).FirstOrDefault(); 
ctxt.Table.Attatch(orig, recordYouHave); 
+0

Ce que vous décrivez (re-tirant l'enregistrement exact ....) ressemble à ce que je fais déjà (ma solution "maladroite"). – Laurence

+0

J'ai aussi lu cet article sur le fait d'avoir un datacontext de courte durée, donc je ne vais pas essayer ça! – Laurence

+0

L'approche que j'ai mentionnée est en effet très similaire à la vôtre, mais elle a l'avantage de ne pas être une nouvelle instance du type de l'objet et est plutôt l'objet réel que vous voulez modifier.À part ça, non, ce n'est pas si différent. J'ai peur, cependant, qu'une fois qu'un objet perd son contexte original, il n'y a aucun moyen de l'attacher à un autre. J'aurais aimé pouvoir être d'une meilleure aide! – diceguyd30