2009-07-15 14 views
20

Ich versuche, eine Entität an den ObjectContext anzuhängen. Wenn ich dies tun, wird die folgende InvalidOperationException ausgelöst:Kann keine getrennte Entität anhängen: "Ein Objekt mit demselben Schlüssel ist bereits im ObjectStateManager vorhanden"

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

ich im Objektstatus-Manager überprüft und der Artikel existiert nicht:

//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 in diesem abstrakten Beispiel aussehen und mir sagen, ob es macht Sinn:

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 auch willkommen.

Antwort

7

Konnte Ihre Kontakteinheit zwei untergeordnete Entitäten mit derselben EntityKey haben? Ist es beispielsweise möglich, von der Contact-Entität zu zwei Address-Entities mit demselben Schlüssel zu gelangen?

Wenn Sie MergeOptions.NoTracking angeben, gibt ein Kontext gerne ein Diagramm für losgelöste Objekte zurück, das Entitäten mit demselben Schlüssel enthält. Wenn Sie jedoch dasselbe Objektdiagramm anhängen, wird 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 enthalten sind.

+0

Im Angesicht eines ähnlichen Problems, können Sie ein Beispiel geben, wie würden Sie das gesamte Objektdiagramm betrachten, das Sie an den Kontext anhängen und prüfen, ob Objekte mit doppelten Schlüsseln darin enthalten sind? – Eduard

4

Ich hatte das gleiche Problem innerhalb meiner Anwendung erlebt.

Ich habe das Problem gelöst, indem ObjectStateManager TryGetObjectStateEntry Method

In der Tat mit den EntityState Bauträgern sind irreführend. Obwohl es Freistehend anzeigt, ist es interessant, dass Fehler verursacht werden.

5

Antwort ist (und ich habe nicht erwähnt, dass dies das Problem war, da ich nicht wusste, es ist), dass, wenn Sie eine Navigationseigenschaft zu einer verfolgten Einheit der neue Einheit gesetzt wird 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 kommt es, dass die Entity verfolgt wird. Ich würde die gesamte Frage löschen, aber da es Mühe anderer Antwort gibt, die hilfreich sein könnte, werde ich es hier lassen, stimmen Sie, um zu schließen, wenn Sie denken, dass es geschlossen werden sollte.

+0

Related: http://StackOverflow.com/Questions/8759699/entity-framework-creating-new-entity-with-relationship-to-existing-entity-resul – Andre

0

Überprüfen Sie, ob Sie die EntityKey-Eigenschaft des Entity-Objekts festlegen. Wenn Sie es festlegen, stellen Sie sicher, dass Sie nicht von einem vorhandenen Entitätsobjekt kopieren.

Verwandte Themen