2009-07-24 16 views
1

Obwohl dies wahrscheinlich nicht die beste Vorgehensweise ist, versuche ich eine Reihe von Datensätzen aus einer Datenbanktabelle zu löschen und dann eine Reihe von Datensätzen einzufügen - von denen einige möglicherweise in der ursprünglichen Serie waren. und andere, die neu sein können. Ich benutze linqtosql in C#. Pseudo-Code muss ich tun, ist unten; Es schlägt fehl mit "Kann eine Entität nicht mit einem Schlüssel hinzufügen, der bereits verwendet wird."LinqtoSQL - Löschen und Einfügen

using (dbDataContext context = new dbDataContext() 
{ 
    // I've also tried using table.LinkedTable.Clear(); but that shows the same error 
    while (table.LinkedTable.Count() > 0) 
    { 
    table.LinkedTable.RemoveAt(0); 
    } 

    foreach (ListItem item in SelectedItems.Items) 
    { 
    LinkedTable lt = new LinkedTable(); 
    lt.id = table.id; 
    lt.SomeValue = item.SelectedValue; 
    table.LinedTable.Add(lt); 
    } 
    context.SubmitChanges(); 
} 

Es scheint wie LinqToSql nicht zur Kenntnis nehmen, die ich Elemente entfernt haben, bevor es versucht, Artikel hinzufügen, eine Verdoppelung Fehler verursacht. Hat jemand irgendwelche Vorschläge, um das zu korrigieren?

BEARBEITEN Wenn ich ein SubmitChanges nach dem Löschen hinzufügen, habe ich am Ende mit dieser Nachricht.

"Es wurde versucht, eine Beziehung zwischen einer Tabelle und einer LinkedTable zu entfernen. Einer der Fremdschlüssel der Beziehung (LinkedTable.Id) kann jedoch nicht auf null gesetzt werden."

+0

Was passiert, wenn Sie ein Insert "context.SubmitChanges();" Rufe zwischen dem Löschen deines Tisches und dem Einfügen neuer Einträge auf? –

Antwort

2

Sie könnten versuchen, die ITable.DeleteAllOnSubmit Methode zu verwenden:

using (dbDataContext context = new dbDataContext() 
{ 
    // table.LinkedTable is a EntitySet of LinkedTable objects, 
    // we remove from the "LinkedTable" table, the records that 
    // are related to the "table" object: 
    context.LinkedTable.DeleteAllOnSubmit(table.LinkedTable); 

    foreach (ListItem item in SelectedItems.Items) 
    { 
    LinkedTable lt = new LinkedTable(); 
    lt.id = table.id; 
    lt.SomeValue = item.SelectedValue; 
    table.LinedTable.Add(lt); 
    } 
    context.SubmitChanges(); 
} 
+0

Das funktioniert perfekt - obwohl kann jemand sagen * warum * es tut, dann .Clear() und .Remove() nicht? – user9659

+1

Löschen und Entfernen entfernen Sie sie nur lokal. DeleteOnSubmit() legt fest, dass es im Kontext gelöscht wird, damit es tatsächlich aus der Datenbank entfernt wird. – Stephan

+0

Ich vermute, dass ich vom Methodenname geworfen wurde, erwartet Delete * OnSubmit *, um die Datensätze * OnSubmit * zu löschen. Danke für die Antwort :) – user9659

0

Sieht aus, als ob Sie einen Aufruf von .SubmitChanges() verpassen, nachdem Sie die nicht gewünschten Datensätze entfernt haben.

Zum Beispiel (mit Ihrem Pseudo-Code):

using (dbDataContext context = new dbDataContext() 
{ 
    // I've also tried using table.LinkedTable.Clear(); but that shows the same error 
    while (table.LinkedTable.Count() > 0) 
    { 
    table.LinkedTable.RemoveAt(0); 
    } 
    context.SubmitChanges();  // Submit the "removal" of records HERE!!! 


    foreach (ListItem item in SelectedItems.Items) 
    { 
    LinkedTable lt = new LinkedTable(); 
    lt.id = table.id; 
    lt.SomeValue = item.SelectedValue; 
    table.LinedTable.Add(lt); 
    } 
    context.SubmitChanges(); 
}