Ein Objekt mit demselben Schlüssel ist bereits vorhanden in der ObjectStateManager
Habe ich ein Szenario, das konnte nicht die Lösung und brauche etwas Hilfe
Wie kann ich das erreichen,
Ich würde gerne aktuelle Datensatz für den client zu modifizieren und statt der update-ich möchte noch hinzufügen, dass der neue Datensatz in die Tabelle für historische Daten ändern,
client c = new client();
using (DBEntities db = new DBEntities())
{
//get current records in the client table for client
IQueryable<client> co = from p in db.client where p.CUS_NUMBER == scd.cus_number && p.isCurrent == true select p;
c = co.First();
//update email and and address
c.EMAIL = Helper.CleanInput("[email protected]");
c.ADDRESS = Helper.CleanInput("123 Sheppard");
//instead of updating current record I'd like to add new record to the table to keep historical changes
db.AddToclient(c);
db.SaveChanges();
//I get error that
//An object with the same key already exists in the ObjectStateManager.
//The existing object is in the Modified state. An object can only be added to
//the ObjectStateManager again if it is in the added state.
Vollständige Fehlermeldung
Wird ein Objekt mit demselben Schlüssel ist bereits vorhanden in der ObjectStateManager. Das vorhandene Objekt wird in dem Modifizierten Zustand. Ein Objekt kann nur Hinzugefügt werden, um den ObjectStateManager wieder, wenn es in dem zusätzlichen Zustand.
InformationsquelleAutor user2110791 | 2013-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
entfernen Sie diesen code
db.AddToclient(c);
,rest alles in Ordnung ist,sind Sie bereits Zugriff auf das Objekt durch den Verweis so dass keine Notwendigkeit, um es erneut hinzuzufügen.Werde es geändert, wenn Sie anrufensavechanges()
verwenden oder Klonen, wenn Sie hinzufügen möchten neues Objekt
c = co.First().Clone();
InformationsquelleAutor Cris
Es schauen, wie Sie hinzufügen, gleiche Zeile in der Datenbank und Fehler kommt, aufgrund der addition der gleichen Zeile wieder mit demselben Primärschlüssel die DB nicht erlauben.
Versuchen Sie, fügen Sie neue Zeilen und machen Sie eine weitere Tabelle hält die Historischen Daten der alten Zeile und einer Referenz als foreign key. Sie können hinzufügen, ein boolean Feld, das halten, die Informationen zu löschen lassen, Es ist IsDeleted.
Hoffe, Es wird Helfen
Dank
InformationsquelleAutor Rajeev Ranjan
Den Grund
db.AddToclient(c);
gibt den Fehler ist, weil dieses Objekt wird verfolgt von den Objekt-Kontext, durch die möglicherweise in der Datenbank.Der beste Weg, das zu erreichen, was Sie zu tun versuchen, ist so etwas wie die folgenden:
danke, korrigiere meine Antwort
InformationsquelleAutor rhughes
In Entity Framework, alle abgerufenen Objekte aus der Datenbank standardmäßig werden anhand des ObjectContext-Instanz. Entity Framework intern ordnet alle Objekte, die verfolgt werden, indem sein Key. Diese Muster heißt Identität Anzeigen. Dies bedeutet, dass es nur eine Instanz einer Entität pro Schlüssel. Also, Sie brauchen nicht zu rufen, Sie erneut Hinzufügen, da das Unternehmen bereits auf EF-Karte. Sie müssen nur SaveChanges aufrufen beibehalten geänderte Entitäten.
In Ihrem Fall sind Sie:
1 - Erstellen einer neuen Instanz der EF ObjectContext;
2 - Abrufen von Entitäten in Ihrer LINQ-Abfrage;
3 - Ändern der Werte von Eigenschaften der aufgerufenen Person;
4 - Zugabe wieder auf die ObjContext; //Fehler!
5 - Aufruf Von SaveChanges()
Schritt 4 nicht erforderlich, da die ObjectContext bereits kennt, die abgerufenen Objekte.
InformationsquelleAutor Jone Polvora