Impossible d'attacher une entité détachée: "Un objet avec la même clé existe déjà dans ObjectStateManager"

concurrency entity-framework objectstatemanager

Question

J'essaie d'attacher une entité à ObjectContext. Lorsque je le fais, l'exception InvalidOperationException suivante est levée:

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

J'ai vérifié dans le gestionnaire d'état d'objet et l'élément n'existe pas:

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

Ou regardez cet exemple abstrait et dites-moi si cela a du sens:

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

Les réponses en VB sont également les bienvenues.

Réponse acceptée

Votre entité de contact pourrait-elle avoir deux entités enfants avec le même EntityKey ? Par exemple, est-il possible de passer de l'entité Contact à deux entités Address avec la même clé?

Si vous spécifiez MergeOptions.NoTracking, un contexte renverra avec plaisir un graphe d'objet détaché contenant des entités avec la même clé. Cependant, lorsque vous attachez le même graphe d'objet, une exception System.InvalidOperationException est levée.

Je suggérerais que vous examiniez le graphe d'objet entier que vous attachez au contexte et que vous vérifiiez s'il contient des objets contenant des clés dupliquées.


Réponse populaire

La réponse est (et je n’ai pas mentionné que c’était le problème, puisque je ne le savais pas), que si vous définissez une propriété de navigation sur une entité suivie, la nouvelle entité est automatiquement ajoutée:

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

Dim state = a.EntityState '= Added

Comme je ne savais pas que je continuais à me demander pourquoi l’entité est dépistée. Je voudrais supprimer toute la question, mais comme il y a un effort de réponse qui pourrait être utile, je vais le laisser ici, votez pour la clôture si vous pensez qu'elle devrait être fermée.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow