2009-07-31 12 views
0

J'utilise LINQ pour insérer des enregistrements dans la base de données. Je crée ces enregistrements et les conserve en utilisant une liste. Basé sur une certaine logique, je supprime certains des enregistrements en supprimant de la liste. (J'utilise le même objet DataContext).problème avec submitChanges() insertion d'enregistrements indésirables dans linq

Lorsque je veux insérer les enregistrements dans la base de données, je crée InsertOnSubmit() de la table linq correspondante, suivi de SubmitChanges() sur l'objet datacontext. LINQ insère également les enregistrements supprimés de la liste avec ceux qui sont présents dans la liste.

exemple:

//list to keep track of records to insert 
List list 

// add the records to list 
list.add(some records) 

//deleted last 2 records 
list.remove() 

//call InsertAllOnSubmit on the linq table passing the list object with records to insert 
linqTable.InsertAllOnSubmit(list) 

//call SubmitChanges on datacontext object 
datacontext.SubmitChanges() 

je suis tombé sur cet article msdn Object States and Change-Tracking (LINQ to SQL)

Vous pouvez demander explicitement les insertions en utilisant InsertOnSubmit. Alternativement, LINQ to SQL peut déduire Inserts par trouver des objets connectés à l'un des les objets connus qui doivent être mis à jour. Par exemple, si vous ajoutez un objet Untracked à un EntitySet (TEntity) ou définir une EntityRef (TEntity) à un objet Untracked, vous faites l'objet Untracked accessible par le biais d'objets suivis dans le graphique. Lors du traitement de SubmitChanges, LINQ to SQL traverse les objets suivis et découvre tous les objets persistants accessibles qui ne sont pas suivis . De tels objets sont candidats pour insertion dans la base de données .

Je suppose que la question se résume à ceci: comment changer l'état des objets supprimés en 'Untracked'?

J'ai essayé DeleteOnSubmit après avoir supprimé les objets de la liste mais cela donne une exception (Impossible de supprimer une entité qui n'a pas été attachée).

Quelqu'un peut-il me diriger vers une solution? Merci.

Je voudrais savoir si je peux y parvenir en utilisant uniquement LINQ. (Je sais que je peux utiliser un proc stocké et insérer seulement les enregistrements dans la liste.)

Répondre

0

Je pense que les éléments de votre liste ne sont pas supprimés, car la méthode List.Remove détermine l'égalité en utilisant le comparateur d'égalité par défaut.

Si vous ne voulez pas écrire un comparateur personnalisé, je vous recommande d'utiliser la méthode RemoveAll, qui reçoit un prédicat comme premier paramètre pour correspondre aux éléments qui seront retirés de la liste:

list.RemoveAll(e=> /*condition to remove the element*/); 

Ou la méthode RemoveAt, qui supprime l'élément en fonction de l'index spécifié:

list.RemoveAt(0); // Delete first element 
+0

C'est pas. La liste remove() fonctionne correctement - je tiens une référence aux éléments que je veux supprimer. Les enregistrements insérés dans la base de données sont supérieurs aux enregistrements de la liste. – hIpPy

+0

Un autre point à noter est que LINQ to SQL parcourt les objets suivis * lors du traitement de SubmitChanges * (et non pendant que les enregistrements sont ajoutés ou supprimés) et découvre tous les objets persistants inaccessibles qui ne sont pas suivis. Ce qui signifie que même si je change explicitement l'état des enregistrements indésirables en 'Untracked' alors que je les supprime, ils seront quand même découverts lorsque SubmitChanges sera finalement appelé plus tard. – hIpPy

Questions connexes