entity framework - net - No se puede adjuntar una entidad separada: "Ya existe un objeto con la misma clave en el ObjectStateManager"
mvc 5 with entity framework (4)
Estoy tratando de adjuntar una entidad al ObjectContext. Cuando lo hago, se lanza la siguiente excepción InvalidOperationException:
An object with the same key already exists in the ObjectStateManager.
The ObjectStateManager cannot track multiple objects with the same key.
Me registré en el administrador de estado del objeto y el artículo no existe:
//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 mira este ejemplo abstracto y dime si tiene sentido:
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
Respuestas en VB son bienvenidas también.
¿Podría su entidad de contacto tener dos entidades secundarias con la misma EntityKey ? Por ejemplo, ¿es posible pasar de la entidad de contacto a dos entidades de dirección con la misma clave?
Si especifica MergeOptions.NoTracking un contexto felizmente devolverá un gráfico de objeto separado que contiene entidades con la misma clave. Sin embargo, cuando adjunte el mismo gráfico de objeto, se lanzará una System.InvalidOperationException .
Le sugiero que mire todo el gráfico de objetos que está adjuntando al contexto y verifique si hay objetos con claves duplicadas.
Compruebe si está configurando la propiedad EntityKey del objeto Entity. Si lo está configurando, asegúrese de que no está copiando de un objeto de entidad existente.
Había experimentado el mismo problema dentro de mi aplicación.
Resolví el problema utilizando el método ObjectStateManager TryGetObjectStateEntry
De hecho, la propiedad EntityState es engañosa para los desarrolladores. A pesar de que se muestra Desacoplado, interesante que provoca error.
La respuesta es (y no mencioné que este era el problema, ya que no lo sabía), que si establece una propiedad de navegación en una entidad rastreada, la nueva entidad se agregará automáticamente:
Dim s = context.States.FirstOrDefault()
Dim a As New Address
a.State = s
Dim state = a.EntityState ''= Added
Como no sabía, seguí preguntándome por qué se rastrea a la entidad. Eliminaré la pregunta completa, pero dado que hay un esfuerzo de otra respuesta que podría ser útil, la dejaré aquí, vote para cerrar si cree que debería estar cerrada.