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?
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);
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
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.
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
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);
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 .