Ich arbeite seit Monaten an meiner ASP.NET MVC-Anwendung. Als ich anfing, daran zu arbeiten, benutzte ich Entity Framework 4.3 (Code-First w/Migrations). Während ich dies tat, stieß ich auf einige Probleme, die versuchen, Aktualisierungen auf meiner MainClient-Tabelle vorzunehmen. Der MainClient enthält alle grundlegenden Informationen eines Kunden und hat eine 1: 1-Beziehung mit der Tabelle BPClient, die spezifischere Informationen über diesen Kunden enthält, die zu seiner Lizenzvereinbarung für das BP-Modul gehören. Beide können auf der gleichen Seite in einem Tab-Steuerelement bearbeitet werden. Allerdings hielt ich auf die folgende Ausnahme, wenn ich versuche, um die EntityState des MainClient Objekts zu ändern EntityState.Modified werden:Entity Framework 4.3 vs. 5.0 Aktualisieren der Unterschiede
System.InvalidOperationException : An object with the same key already exists
in the ObjectStateManager. The ObjectStateManager cannot track multiple objects
with the same key.
ich beim Debuggen bemerkt, dass das Objekt selbst wurde Frei stehend betrachtet, wenn es in meine Controller-Klasse ging gespeichert werden. Um dieses Problem zu umgehen, habe ich eine ähnliche Lösung für die Probleme gefunden, die in this blog post und in this SO question gefunden wurden. Hier ist, wie der Code für Wiederanbringung der Objekte sah danach (unordentlich, ich weiß), da die Edit-Methode in einem MainClient Objekt client
genannt geben wird:
var newClientObject = new MainClient { ClientID = client.ClientID };
Db.MainClients.Attach(newClientObject);
Db.Entry(newClientObject).CurrentValues.SetValues(client);
var bpClient = new BPClient { ClientID = client.ClientID, BaseClient = newClientObject };
if (client.BPClient != null)
{
Db.BostonpostClients.Attach(bpClient);
Db.Entry(bpClient).CurrentValues.SetValues(client.BPClient);
}
Db.SaveChanges()
Dies funktionierte gut und gut über alle Testfälle. Bis vor kurzem.
Vor kurzem habe ich meine Anwendung aktualisiert, um Entity Framework 5 zu verwenden (immer noch mit Code-First). Als ich die MainClient-Bearbeitungsseite erneut getestet habe, habe ich jedoch ein ziemlich unberechenbares Verhalten festgestellt. Einige Felder wurden beim Bearbeiten ohne Probleme gespeichert. Andere würden niemals der DB verpflichtet werden. Wieder andere würden in Ordnung bleiben, aber nur, wenn sie der einzige Teil des zu bearbeitenden Objekts wären. Ich habe den DbContext aus der Controller-Klasse ausgepackt und festgestellt, dass nicht nur die Änderungen auf der Seite an die Controller-Klasse gesendet wurden, sondern dass der ObjectStateManager sowohl das MainClient- als auch das BPClient-Objekt enthielt es mit den Änderungen, die auf der Seite auch gemacht worden waren! Ich sollte hier übrigens erwähnen, dass ich beim Debuggen keinen Fehler erhalten habe, auch nicht nach SaveChanges().
ich den Code zu versuchen beschlossen und zurückkommen, was es ursprünglich war, das ist den logischen Weg, es zu sagen, zu tun:
Db.Entry<BPClient>(client.BPClient).State = EntityState.Modified;
Db.Entry<MainClient>(client).State = EntityState.Modified;
Db.SaveChanges();
Und es funktioniert jetzt völlig in Ordnung. Keine InvalidOperationException. Das wurde also gut gelöst.
Was mich immer noch stört ist zu versuchen, herauszufinden, was in 5.0 geändert wurde, das meine frühere Reparatur aufhört zu arbeiten und alle wackelig auf mich zu gehen. Warum funktioniert dieser Code in 4.3, aber nicht in 5.0? Was in 5.0 hat die Datenbank mit diesem Code so unberechenbar gemacht?
Weiß jemand, warum das passiert wäre?
Es könnte Ihnen helfen. Entity Framework 5 Enums und Moving Solution von EF 4.3 http://thedatafarm.com/blog/data-access/video-entity-framework-5-enums-and-moving-solution-from-ef-4-3/ – Aru