Unter Bezugnahme auf den unten stehenden Code habe ich eine Liste von Error
Objekte, die zum Einfügen instanziiert wurden. Jedem Fehler wurde ein ErrorType
Objekt, das aus der Datenbank abgerufen wurde. Wenn ich versuche, die Liste der Fehler in einen neuen Kontext einzufügen, erhalte ich von der Datenbank eine Ausnahme von unique index violation
auf ErrorType. Dies ist sinnvoll, da der neue Kontext davon ausgeht, dass das ErrorType-Objekt ebenfalls neu ist, ohne zu wissen, dass es bereits in der Datenbank existiert. Ich habe versucht, dieses Problem durch die Verwendung von Attach on ErrorType zu lösen, sowie eine erneute Abfrage aller ErrorTypes in der Datenbank zu tun, aber das schien nicht zu helfen. Ich habe den SQL Profiler ausgeführt und sehe immer noch, dass EF eine Einfügeanweisung für die Entität "ErrorType" ausgibt.
bearbeiten : Ich habe auch "Versuch 1.5" hinzugefügt, der in Verbindung mit "Versuch 1" tatsächlich die Aufgabe erfüllt. Ich verstehe immer noch nicht, warum ich zurückgehen und alle error.ErrorType-Referenzen ändern muss, um auf das lokal erstellte und angehängte ErrorType-Objekt zu verweisen. Ich verstehe, dass der ursprüngliche ErrorType und der lokal erstellte unterschiedliche Objekte im Speicher sind, aber sie teilen den gleichen PrimaryKey, so dass meine Annahme war, dass Entity Framework versteht, dass sie ein und dasselbe sind.
Es scheint auch, dass ich nicht in der Lage, die ursprüngliche FileErrorType (im Gegensatz zu den lokalen) anhängen, weil es dann versucht, den gesamten Graphen anzuhängen, deshalb habe ich eine lokale Kopie des FileErrorType-Objekts, die den gleichen Primärschlüsselwert hat zu erstellen.
void InsertErrors(IList<Error> errors)
{
using(var context = ....)
{
//Try 1:
//asuming there is only 1 error type (true in my example)
//ErrorType et = new ErrorType();
//ErrorTypeId is the primary key
//et.ErrorTypeId = errors[0].ErrorType.ErrorTypeId;
//context.ErrorTypes.Attach(et);
//Try 1.5
//If I also add the followin code to Try 1, everything works, but I'm not sure why
//foreach(var e in errors)
//{
// error.ErrorType = et; //reassign to the locally created ErrorType object that has been Attached
//}
//Try 2:
//var errorTypes = context.ErrorTypes.ToList();
foreach(var e in errors)
{
context.Errors.AddObject(e);
}
context.SaveChanges();
}
}