2016-07-28 8 views
0

Hier ist mein prblemEF Kern RemoveRange Artikel nicht auf Transaktion entfernt

using (var db = new CassaContext()) {   
     var DbSet = db.GetByName(item.Name); 
     DbSet.RemoveRange(DbSet); 

     for (var i = 0; i < data.Count; i++) 
     { 
      JObject jitem = data[i] as JObject; 
      var dbobj = vm.Db.JsonToObject(jitem);    
      DbSet.Add(dbobj); 
     } 

     db.SaveChanges(); 
} 

Wenn i db.SaveChanges hinzufügen wird() nach dem RemoveRange() istruction, alles ist in Ordnung, aber, ohne dass, habe ich den Fehler

die Instanz des Entity-Typ ‚Benutzer‘ kann nicht, weil eine andere Instanz dieses Typs mit dem gleichen Schlüssel verfolgt werden wird bereits verfolgt. Beim Hinzufügen neuer Entitäten wird für die meisten Schlüsseltypen ein eindeutiger temporärer Schlüsselwert erstellt, wenn kein Schlüssel festgelegt ist (d. H. Wenn der Schlüssel -Eigenschaft der Standardwert für seinen Typ zugewiesen ist). Wenn Sie explizit Schlüsselwerte für neue Entitäten festlegen, stellen Sie sicher, dass sie nicht kollidieren mit vorhandenen Entitäten oder temporäre Werte für andere neue Entitäten generiert. Achten Sie beim Anhängen vorhandener Entitäten darauf, dass nur eine Entitätsinstanz mit einem bestimmten Schlüsselwert an den Kontext angehängt ist.

Ich möchte das Speichern nach dem Entfernungsbereich vermeiden, da ich keine leeren Tabellen haben werde, wenn die Transaktion fehlschlägt.

Wie kann ich das lösen? Danke im Voraus! Wenn Sie mehr brauchen, fragen Sie einfach!

+0

Die Ausnahme ist ziemlich klar: * eine andere Instanz dieses Typs mit demselben Schlüssel ist bereits * verfolgt. Sie fügen eine Entität hinzu, die Sie gerade entfernt haben. –

+0

Und was wäre das Problem? Es funktionierte auch auf EF7. Ich denke, ich kann Entitäten in einer Datenbank einfügen und entfernen. – thepasto

Antwort

2

Nicht sicher über diesen Fehler, aber man konnte eine explizite Transaktion versuchen Sie es mit:

using (var db = new CassaContext()) 
using (var transaction = db.Database.BeginTransaction()) 
{ 
    var DbSet = db.GetByName(item.Name); 
    DbSet.RemoveRange(DbSet); 
    db.SaveChanges(); 

    for (var i = 0; i < data.Count; i++) 
    { 
     JObject jitem = data[i] as JObject; 
     var dbobj = vm.Db.JsonToObject(jitem);    
     DbSet.Add(dbobj); 
    } 
    db.SaveChanges(); 

    transaction.Commit(); 
} 
+0

Danke! Es macht den Job! Es scheint auch bei Transaktionsfehlern zu funktionieren. Ich habe nicht daran gedacht, eine explizite Transaktion zu verwenden, weil sie auf EF7 arbeitete. Danke noch einmal – thepasto

Verwandte Themen