web-dev-qa-db-de.com

Ein Objekt mit demselben Schlüssel ist bereits im ObjectStateManager vorhanden. Der ObjectStateManager kann nicht mehrere Objekte mit demselben Schlüssel verfolgen

Ich habe folgenden Code, um das Entity-Objekt hinzuzufügen oder zu aktualisieren. Finden des Objekts anhand des Primärschlüssels basierend auf der Antwort, die ich dem Objekt hinzufüge oder aktualisiere.

Datensatz hinzufügen funktioniert, aber während der Aktualisierung wird diese Fehlermeldung ausgegeben " Ein Objekt mit demselben Schlüssel ist bereits im ObjectStateManager vorhanden. Der ObjectStateManager kann nicht mehrere Objekte mit demselben Schlüssel verfolgen."

In meiner MSSQL-Datenbank habe ich nur einen Datensatz.

var v = db.Envelopes.Find(model.ReportDate, model.Service);
if (v == null)
{
    db.Envelopes.Add(model);
    db.SaveChanges();
    ViewBag.status = "Record Add successfully";
    ModelState.Clear();
}
else
{
    db.Entry(model).State = EntityState.Modified;
    db.SaveChanges();
}

Wie kann ich diese Fehlermeldung beheben?

52
sfgroups

Wie von @anon erwähnt, können Sie kein Modell anhängen, wenn Sie das Objekt mit demselben Schlüssel geladen haben. Die Änderungen müssen auf die verbundene Entität angewendet werden. An Stelle von:

db.Entry(model).State = EntityState.Modified;

benutze das: 

db.Entry(v).CurrentValues.SetValues(model);
88
Ladislav Mrnka

Wenn eine frühere Abfrage die zu aktualisierende Entität liest und Sie deshalb den Fehler erhalten, können Sie diese Abfrage in AsNoTracking ändern. Siehe das AsNoTracking-Beispiel unter: http://www.asp.net/entity-framework/tutorials/advanced-entity-framework-scenarios-for-an-mvc-web-application

9
tdykstra

Ich nehme an, Sie sagen, dass Ihr Fehler hier auftritt:

db.Entry(model).State = EntityState.Modified;

Wenn Sie Find () ausführen, wird Ihr Umschlag bereits in Ihrem Kontext nachverfolgt. Das bedeutet, wenn Sie eine Eigenschaft ändern müssen, ändern Sie sie einfach in v und rufen Sie dann SaveChanges () auf. Machen Sie sich keine Sorgen, wenn Sie den Status auf "Modifiziert" setzen.

7
anon

Wenn Sie Ihren Kontext auf AsNoTracking () setzen, wird aspmvc gestoppt, um die Änderungen an der Entität im Arbeitsspeicher zu verfolgen (was Sie im Web sowieso möchten). Vergessen Sie nicht die using-Anweisung.

using System.Data.Entity;

db.Envelopes.AsNoTracking().Find(model.ReportDate, model.Service);

Ich habe dies aus diesem Forum-Beitrag erhalten -> http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/advanced-entity-framework-scenarios-for- eine -mvc-web-anwendung

5
David Swindells

Ich verwende das, weil ich bereits eine neue Instanz erstellt und die zu aktualisierenden Eigenschaften gefüllt habe.

var key=this.CreateEntityKey("Envelopes",model); 
        ObjectStateEntry ose;
        if(this.ObjectStateManager.TryGetObjectStateEntry(key, out ose)){
            var entity=(Page)ose.Entity;
            Envelopes.Detach(entity);
        }
            this.Envelopes.Attach(model);
3
Maslow

Ein anderer Ansatz, um das Problem zu lösen, ist trennt verfolgte Entität ab und bindet die geänderte Einheit erneut an. Siehe meine Lösung hier

0