2016-12-22 6 views
0

AKTUALISIERT: Ich habe ein Stück Code, der Datensätze erstellt, wenn sie nicht vorhanden sind, oder aktualisiert sie, wenn sie vorhanden sind. Während jedoch die Aufzeichnungen ich versucht, diese Ausnahme erhalten zu aktualisieren:Entity Framework-Kern - DbUpdateException

Microsoft.EntityFrameworkCore.DbUpdateException Die DELETE-Anweisung in Konflikt mit der REFERENCE-Einschränkung

public static string AddCurrencies(ApplicationDbContext db) 
{ 
    // ... 

    foreach (Currency c in db.Currency.ToList()) 
    { 
     try 
     { 
      db.Remove(c); // the troublemaker! 
      db.SaveChanges(); 
     } 
     catch 
     { 
      // probably in use (foreign key) 
     } 
    } 

    // ... 

    foreach (Currency c in CurrencyList) 
    { 
     var c_db = db.Currency.FirstOrDefault(x => x.Code == c.Code); 
     if (c_db == null) 
     { 
      // adding 
      db.Currency.Add(c); 
     } 
     else 
     { 
      // updating 
      c_db.Name = c.Name; 
      c_db.LocalDisplay = c.LocalDisplay; 
     } 
     db.SaveChanges(); // exception fired if updating! 
    } 

    // ... 
} 

Nach einigen Untersuchungen, und mit der Lage Um das SQL-Debugging zu aktivieren, habe ich herausgefunden, dass Remove() "bestehen bleibt" und dass es mit dem zweiten Aufruf von SaveChanges() erneut versucht wird, daher die Ausnahme. Nun wird die Frage neu formuliert: Wie kann ich (in Ermangelung eines besseren Ausdrucks) die Remove() - Befehle, die fehlgeschlagen sind, "rückgängig machen"?

+0

Ist Name der Schlüssel der Währung? [Untersuchen Sie das generierte SQL] (https://msdn.microsoft.com/en-us/data/dn469464.aspx) nach Hinweisen. –

+0

Nein, Name ist nicht der Schlüssel. | db.Database.Log => Kann 'Log' nicht zuweisen, da es eine 'Methodengruppe' ist. – Marko

+0

Fügen Sie dies vor SaveChanges() hinzu: 'db.Database.Log = s => System.Diagnostics.Debug.WriteLine (s); 'dann Blick auf Debugger-Ausgabe –

Antwort

0

ich es geschafft, dieses Problem auf diese Weise zu lösen:

var entry = context.Entry(entity); 
entry.Reload(); 

für jeden Eintrag in dem gescheiterten löschen.

Verwandte Themen