2009-07-24 11 views
1

Bien que ce ne soit probablement pas la meilleure pratique, j'essaie d'effacer une série d'enregistrements d'une table de base de données, puis d'insérer une série d'enregistrements - dont certains peuvent avoir été dans la série originale, et d'autres qui peuvent être nouveaux. J'utilise linqtosql en C#. Pseudo-code que je dois faire est ci-dessous; il échoue avec "Impossible d'ajouter une entité avec une clé déjà utilisée".LinqtoSQL - effacement puis insertion

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(); 
} 

Il semble que LinqToSql ne prend pas la note que je l'ai supprimé des éléments, avant d'essayer d'ajouter des éléments, ce qui provoque une erreur de duplication. Est-ce que quelqu'un a des suggestions pour corriger cela? Si j'ajoute un SubmitChanges après avoir effectué les suppressions, je me retrouve avec ce message.

"Une tentative de suppression d'une relation entre une table et un LinkedTable a été effectuée, mais l'une des clés étrangères de la relation (LinkedTable.Id) ne peut pas être définie sur null."

+0

Qu'est-ce qui se passe lorsque vous insérez un "context.SubmitChanges();" appelez entre le nettoyage de votre table et l'insertion de nouveaux enregistrements? –

Répondre

2

Vous pouvez essayer d'utiliser la méthode ITable.DeleteAllOnSubmit:

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

Cela fonctionne parfaitement - bien que quelqu'un peut dire * pourquoi * il le fait, alors .Clear() et .Remove() ne le font pas? – user9659

+1

Effacer et Supprimer uniquement les supprimer localement. DeleteOnSubmit() le définit pour être supprimé dans le contexte afin qu'il soit réellement supprimé de la base de données. – Stephan

+0

Je suppose que j'ai été jeté par le nom de la méthode, en attendant Delete * OnSubmit * pour supprimer les enregistrements * OnSubmit *. Merci pour la réponse si :) – user9659

0

Il semble qu'il vous manque un appel à .SubmitChanges() après avoir supprimé les enregistrements dont vous ne voulez pas.

Par exemple (en utilisant votre 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(); 
}