Tengo un problema con el código del Entity Framework primero en MVC3. Estoy llegando a esta excepción:Código de Entity Framework: Primero: "ObjectStateManager no puede rastrear múltiples objetos con la misma clave".
Ya existe un objeto con la misma clave en el ObjectStateManager. ObjectStateManager no puede rastrear múltiples objetos con la misma clave .
Esto se aborda muchas veces en SO, pero estoy teniendo problemas para utilizar cualquiera de las soluciones sugeridas en mi situación.
Aquí es un ejemplo de código:
FestORM.SaleMethod method = new FestORM.SaleMethod
{
Id = 2,
Name = "Test Sale Method"
};
FestContext context = new FestContext();
//everything works without this line:
string thisQueryWillMessThingsUp =
context.SaleMethods.Where(m => m.Id == 2).Single().Name;
context.Entry(method).State = System.Data.EntityState.Modified;
context.SaveChanges();
Editado para aclarar: Estoy intentando actualizar un objeto que ya existe en la base de datos.
Todo funciona bien sin la consulta indicada en el código. En mi aplicación, mi controlador está creando instancias del contexto, y ese mismo contexto se pasa a varios repositorios que usa el controlador, por lo que no puedo usar simplemente un contexto diferente para la operación de consulta inicial. Intenté eliminar a la entidad del seguimiento en ObjectStateManager, pero parece que tampoco puedo llegar a ninguna parte con eso. Estoy tratando de encontrar una solución que funcione para ambas condiciones: a veces voy a actualizar un objeto que es rastreado por el ObjectStateManager, y algunas veces todavía no ha sido rastreado.
Fwiw, mis funciones de almacén reales tienen este aspecto, al igual que el código anterior:
public void Update(T entity)
{
//works ONLY when entity is not tracked by ObjectStateManager
_context.Entry(entity).State = System.Data.EntityState.Modified;
}
public void SaveChanges()
{
_context.SaveChanges();
}
¿Alguna idea? He estado luchando esto durante demasiado tiempo ...
Gracias. (No me permite votar su respuesta porque soy nuevo.) El problema con esto es que no sé cuándo estoy haciendo una consulta que precede a una actualización futura. La consulta puede estar enterrada en algún lugar de la capa de servicio, y finalmente, cuando voy a hacer una actualización en la misma entidad que se consultó, presiono el error. ¿Hay alguna forma de eliminar el objeto del seguimiento del contexto o de localizar el objeto que el contexto rastrea y comunicar al contexto que efectivamente estoy actualizando este objeto en cuestión? He investigado algunos en esta dirección, pero aún no tengo suerte. – Josh
Depende de cuál sea la intención de la consulta. Si la consulta pretende incluir una entidad en el contexto para que pueda ser actualizada y guardada, lo que es habitual, entonces debe diseñar para eso, posiblemente asegurándose antes de guardar que la entidad ingresa, si no lo ha hecho. sido traído antes Si la intención de la consulta es obtener alguna propiedad de la entidad de la base de datos por algún motivo sin incluir a la entidad en el contexto, entonces use AsNoTracking en esa consulta como se muestra arriba. –
Para agregar a mi comentario anterior, si quiere asegurarse de que la entidad ha sido ingresada, entonces use el método Find antes de actualizar las propiedades en la entidad y guardarlas. También puede usar una consulta en lugar de Buscar: de manera predeterminada, la consulta solo mostrará la entidad si aún no está en el contexto. Pero Find es más eficiente. –