Keine getrennte Entität anhängen: "Ein Objekt mit demselben Schlüssel ist bereits im ObjectStateManager vorhanden."

concurrency entity-framework objectstatemanager

Frage

Ich versuche, eine Entität an den ObjectContext anzuhängen. Wenn ich dies tue, wird die folgende InvalidOperationException ausgelöst:

An object with the same key already exists in the ObjectStateManager.
The ObjectStateManager cannot track multiple objects with the same key.

Ich habe den Objektstatus-Manager eingecheckt und der Artikel ist nicht vorhanden:

//Data context is actually the object context.
ObjectStateEntry contact;
while ( //Should only work once since it should be true if the item was attached
          !DataContext.ObjectStateManager.
          TryGetObjectStateEntry(Contact, out contact)
      )
      DataContext.Attach(Contact); //Here is the exception thrown.

Oder schauen Sie sich dieses abstrakte Beispiel an und sagen Sie mir, ob es sinnvoll ist:

EntityState state = Contact.EntityState; //Detached

DataContext.Attach(Contact); //Throws the exception.
DataContext.AttachTo("Entities.Contacts", Contact); //Throws the Exception

var detached = DataContext.ObjectStateManager.
                   GetObjectStateEntries(EntityState.Detached);
//InvalidArgumentException - detached entities cannot be in the obj state mgr

Antworten in VB sind ebenfalls willkommen.

Akzeptierte Antwort

Könnte Ihre Kontaktentität zwei untergeordnete Entitäten mit demselben EntityKey haben ? Ist es beispielsweise möglich, von der Kontaktentität zu zwei Adressentitäten mit demselben Schlüssel zu gelangen?

Wenn Sie MergeOptions.NoTracking angeben, wird ein Kontext ein getrenntes Objektdiagramm liefern , das Entitäten mit demselben Schlüssel enthält. Wenn Sie jedoch dasselbe Objektdiagramm anfügen, wird eine System.InvalidOperationException ausgelöst.

Ich würde vorschlagen, dass Sie das gesamte Objektdiagramm betrachten, das Sie an den Kontext anhängen, und prüfen, ob Objekte mit doppelten Schlüsseln darin sind.


Beliebte Antwort

Die Antwort lautet (und ich habe nicht erwähnt, dass dies das Problem war, da ich nicht wusste, dass dies der Fall ist). Wenn Sie eine Navigationseigenschaft auf eine verfolgte Entität setzen, wird die neue Entität automatisch hinzugefügt:

Dim s = context.States.FirstOrDefault()
Dim a As New Address
a.State = s

Dim state = a.EntityState '= Added

Da ich nicht wusste, dass ich mich immer wieder fragte, wie das Entity verfolgt wird. Ich würde die gesamte Frage streichen, aber da es anstrengende Antworten gibt, die hilfreich sein könnten, werde ich sie hier belassen. Wenn Sie der Meinung sind, dass sie geschlossen werden sollte, stimmen Sie ab.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum