2009-07-15 4 views
20

Sto tentando di collegare un'entità all'ObjectContext. Quando faccio così, il seguente InvalidOperationException è gettato:Impossibile associare un'entità distaccata: "Un oggetto con la stessa chiave esiste già in ObjectStateManager"

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

ho controllato nel gestore oggetto di stato e la voce non esiste:

//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. 

o guardare questo esempio astratto e dimmi se ha senso:

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 

Anche le risposte in VB sono benvenute.

risposta

7

La tua entità di contatto potrebbe avere due entità figlio con lo stesso EntityKey? Ad esempio, è possibile ottenere dall'entità Contatto a due entità Indirizzo con la stessa chiave?

Se si specifica MergeOptions.NoTracking, un contesto restituirà felicemente un grafico di oggetto distaccato che contiene entità con la stessa chiave. Tuttavia, quando si allega lo stesso grafico dell'oggetto, verrà generato un valore System.InvalidOperationException.

Suggerisco di guardare l'intero grafico dell'oggetto che si collega al contesto e verificare se ci sono oggetti con chiavi duplicate.

+0

Im che affronta un problema simile, puoi fornire un esempio di come si può vedere l'intero grafico dell'oggetto che si sta collegando al contesto e verificare se ci sono oggetti con chiavi duplicate? – Eduard

4

Avevo riscontrato lo stesso problema nella mia applicazione.

Ho risolto il problema utilizzando ObjectStateManager TryGetObjectStateEntry Method

Infatti la proprietà EntityState è fuorviante sviluppatori. Sebbene stia visualizzando Staccata, è interessante che questo abbia causato un errore.

5

risposta è (e non ho detto che questo era il problema, dato che non ho so che è), che se si imposta una proprietà di navigazione ad un ente monitorato viene automaticamente aggiunto alla nuova entità:

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

Dim state = a.EntityState '= Added 

Dal momento che non sapevo che continuavo a chiedermi come mai l'entità viene tracciata. Vorrei eliminare l'intera domanda, ma dal momento che vi è uno sforzo di altra risposta che potrebbe essere utile lo lascerò qui, vota per chiudere se pensi che dovrebbe essere chiuso.

+0

Correlati: http://stackoverflow.com/questions/8759699/entity-framework-creating-new-entity-with-relationship-to-existing-entity-resul – Andre

0

Verificare se si sta impostando la proprietà EntityKey dell'oggetto Entity. Se lo stai configurando, assicurati di non copiare da un oggetto entità esistente.