2009-07-31 7 views
0

Ich verwende LINQ, um Datensätze in die Datenbank einzufügen. Ich erstelle diese Aufzeichnungen und verfolge sie mithilfe einer Liste. Basierend auf einer Logik lösche ich einige der Datensätze, indem ich sie aus der Liste lösche. (Ich verwende das gleiche DataContext-Objekt).Problem mit submitChanges() Einfügen von unerwünschten Datensätzen in linq

Wenn ich die Datensätze in die Datenbank einfügen möchte, mache ich die InsertOnSubmit() der entsprechenden Linq-Tabelle, gefolgt von SubmitChanges() auf DataContext-Objekt. LINQ fügt die Datensätze, die aus der Liste gelöscht wurden, ebenfalls zu den Listen hinzu, die in der Liste vorhanden sind.

Beispiel:

//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() 

Ich kam in diesem MSDN-Artikel Object States and Change-Tracking (LINQ to SQL)

Sie explizit können Einsätze anfordern, indem InsertOnSubmit verwenden. Alternativ kann LINQ to SQL durch Inserts von Objekten, die mit einem der der bekannten Objekte verbunden sind, die aktualisiert werden müssen, ableiten. Zum Beispiel, wenn Sie ein Untracked Objekt zu einem EntitySet (TEntity) hinzuzufügen, oder setzen eine EntityRef (TEntity) zu einem Untracked Objekt, machen Sie das Objekt Untracked erreichbar haft verfolgten Objekte in der Graph. Bei der Verarbeitung von SubmitChanges durchläuft LINQ to SQL die verfolgten Objekte und findet alle erreichbaren persistenten Objekte, die nicht verfolgt werden. Solche Objekte sind Kandidaten für die Einfügung in die Datenbank.

Ich denke, die Frage läuft darauf hinaus - wie ändere ich den Status der gelöschten Objekte in "Untracked"?

Ich versuchte DeleteOnSubmit, nachdem ich die Objekte aus der Liste gelöscht habe, aber eine Ausnahme gibt (Eine Entität, die nicht angehängt wurde, kann nicht entfernt werden).

Kann mir bitte jemand eine Lösung zeigen? Vielen Dank.

Ich würde gerne wissen, ob ich dies nur mit LINQ erreichen kann. (Ich weiß, dass ich einen gespeicherten proc verwenden und nur die Datensätze in die Liste einfügen kann.)

Antwort

0

Ich denke, dass die Elemente Ihrer Liste nicht entfernt werden, da die List.Remove Methode Gleichheit mit dem Standardgleichheitsvergleich bestimmt.

Wenn Sie keine benutzerdefinierten comparer schreiben wollen, empfehle ich Ihnen die RemoveAll Methode zu verwenden, die ein Prädikat als erster Parameter empfängt die Elemente übereinstimmen, die aus der Liste entfernt werden:

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

Oder die RemoveAt Verfahren, das entfernt das Element auf dem angegebenen Index basiert:

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

das ist es nicht. Die remove() -Liste der Liste funktioniert korrekt - ich habe einen Verweis auf die Elemente, die ich entfernen möchte. Die Datensätze, die in die Datenbank eingefügt werden, sind größer als die Datensätze in der Liste. – hIpPy

+0

Ein weiterer wichtiger Punkt ist, dass LINQ to SQL die verfolgten Objekte * während der Verarbeitung von SubmitChanges * durchquert (und nicht, während die Datensätze hinzugefügt oder gelöscht werden) und alle erreichbaren persistenten Objekte erkennt, die nicht verfolgt werden. Das heißt, selbst wenn ich den Status der unerwünschten Datensätze während des Löschens explizit in "Untracked" ändere, würden sie immer noch entdeckt werden, wenn SubmitChanges später aufgerufen wird. – hIpPy

Verwandte Themen