2 Stimmen

Verletzung des eindeutigen Index, Versuch, den Objektgraphen in einen neuen Kontext einzufügen

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();
    }
}

1voto

Scott Munro Punkte 13019

Wenn Sie die Fehler hinzufügen, werden sie und die zugehörigen ErrorTypes als hinzugefügt markiert und beim Aufruf von SaveChanges in die Datenbank eingefügt.

Rufen Sie attach für alle ErrorType-Instanzen auf, sobald sie mit dem Kontext verbunden sind. Dadurch wird der Status der ErrorTypes auf Unmodified geändert und verhindert, dass sie während SaveChanges eingefügt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X