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"?
Ist Name der Schlüssel der Währung? [Untersuchen Sie das generierte SQL] (https://msdn.microsoft.com/en-us/data/dn469464.aspx) nach Hinweisen. –
Nein, Name ist nicht der Schlüssel. | db.Database.Log => Kann 'Log' nicht zuweisen, da es eine 'Methodengruppe' ist. – Marko
Fügen Sie dies vor SaveChanges() hinzu: 'db.Database.Log = s => System.Diagnostics.Debug.WriteLine (s); 'dann Blick auf Debugger-Ausgabe –