Ich bin ein Problem mit Einfügen oder Aktualisieren von etwa 950 Entitäten.Entity Framework Core1.1 - Bulk-Insert oder Update - InvalidOperationException
var coins = JsonConvert.DeserializeObject<List<Currency>>(json);
var sw = new Stopwatch();
sw.Start();
using (var ctx = CryptoContext.Get)
{
var existingCoins = ctx.Coins.ToList();
foreach (var coin in coins)
{
var existing = existingCoins.FirstOrDefault(c => c.CMC_Id == coin.CMC_Id);
if (existing != null)
{
ctx.Entry<Currency>(coin).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
} else
{
ctx.Entry<Currency>(coin).State = Microsoft.EntityFrameworkCore.EntityState.Added;
}
}
ctx.SaveChanges();
var el = sw.ElapsedMilliseconds;
}
Der Code läuft im Hintergrund meines netcoreapp1.1, mit SQLite und ruft eine Liste der Währungen. Dies geschieht alle 5 Minuten mit FluentScheduler. Da es sich nicht um große Objekte handelt, führe ich alle Vergleiche im Speicher durch und versuche, jeden einzelnen hinzuzufügen oder zu aktualisieren. Meine Entität hat eine von der Datenbank angegebene Id-ID, und die API, von der ich abrufe, garantiert, dass CMC_Id eindeutig ist.
Die anfängliche Einfügung funktioniert einwandfrei. Ich bekomme einen Fehler beim zweiten "Update". Ich glaube, was passiert ist, dass ich mehrere Entitäten bin Tracking als modifiziert, dass jeweils eine Id von 0
Ich habe versucht, diesen zu folgen: https://msdn.microsoft.com/en-us/library/jj592676(v=vs.113).aspx
und der Fehler I erhalten: "The instance of entity type 'Currency' cannot be tracked because another instance of this type with the same key is already being tracked. When adding new entities, for most key types a unique temporary key value will be created if no key is set (i.e. if the key property is assigned the default value for its type). If you are explicitly setting key values for new entities, ensure they do not collide with existing entities or temporary values generated for other new entities. When attaching existing entities, ensure that only one entity instance with a given key value is attached to the context."
I Ich bin nicht sicher, wie ich mit der Aktualisierung jeder Zeile fortfahren soll.
ich Bandaided haben dieses Problem, indem sie einfach alle Münzen zu entfernen und dann erneut hinzufügen sie, Markierung, wenn der geimpften Id zu hoch ist und es zurückgesetzt wird. Der Vorgang dauert ungefähr 7 Sekunden. –