El objeto no se puede eliminar porque no se encontró en ObjectStateManager

Recibo este error “El objeto no se puede eliminar porque no se encontró en ObjectStateManager”.

Mi código es:

protected MyEntities sqlEntities; public virtual void Delete(TEntity entity) { System.Type t = typeof(TEntity); sqlEntities.DeleteObject(entity); sqlEntities.SaveChanges(); } 

Significa que la entidad no está adjunta (no fue cargada por la misma instancia de contexto). Prueba esto:

 protected MyEntities sqlEntities; public virtual void Delete(TEntity entity) { sqlEntities.Attach(entity); sqlEntities.DeleteObject(entity); sqlEntities.SaveChanges(); } 

Solo una pequeña aclaración sobre la respuesta de Ladislav Mrnka (que debería ser la respuesta aceptada).

Si como yo, tienes código en un formato como este:

 using (var context = new MyDataContext()) { context.MyTableEntity.Remove(EntytyToRemove); var nrOfObjectsChanged = context.SaveChanges(); } 

..then esto lo que quieres hacer:

 using (var context = new MyDataContext()) { // Note: Attatch to the entity: context.MyTableEntity.Attach(EntityToRemove); context.MyTableEntity.Remove(EntityToRemove); var nrOfObjectsChanged = context.SaveChanges(); } 

Tal vez esto parezca obvio, pero inicialmente no me quedó claro que es necesario especificar la entidad a la que se debe apegar, y no solo el contexto .

Para justificar adecuadamente la explicación de Kjartans:

Tuve:

 public Project DeleteProject(int id) { using (var context = new Context()) { var p = GetProject(id); context.Projects.Remove(p); context.SaveChanges(); return p; } } 

El problema es que utilicé mi propio método (GetProject ()) para obtener la entidad (de ahí que use otro contexto para cargar la entidad):

 public Project GetProject(int id) { using (var context = new Context()) { var project = context.Projects .Include(p => p.Reports.Select(q => q.Issues.Select(r => r.Profession))) .Include(p => p.Reports.Select(q => q.Issues.Select(r => r.Room))) .SingleOrDefault(x => x.Id == id); return project; } } 

Una solución podría ser unir la entidad cargada como dice Kjartan, otra podría ser la solución de la mina, cargar la entidad dentro del mismo contexto:

 public Project DeleteProject(int id) { using (var context = new Context()) { var p = context.Projects.SingleOrDefault(x => x.Id == id); if (p == null) return p; context.Projects.Remove(p); context.SaveChanges(); return p; } } 

Sé que esta pregunta es bastante antigua, pero nada de lo anterior funcionó para mí, ya que estaba eliminando registros de más de una clase / servicio y cada uno de ellos creaba una instancia de su propio contexto de conexión de base de datos.

Lo que hice para resolverlo fue enviar el primer contexto creado al rest de las clases / servicios que iban a acceder a la base de datos.

Por ejemplo, mi serviceA iba a eliminar algunos de sus registros y llamar a serviceB y serviceC para hacer lo mismo con sus registros.

Luego eliminaría mis registros en serviceA y pasaría como parámetro el contexto creado en el serviceA para serviceB y serviceC .

En caso de que ninguno de los anteriores funcionó, puede probar esta solución:

context.Entry(yourObject).State = System.Data.Entity.EntityState.Deleted; context.SaveChanges();

Puedes escribir este código:

 var x=yourquery.FirstOrDefault(); sqlEntities.DeleteObject(x); sqlEntities.SaveChanges(); 

Debe asegurarse de que su objeto exista en la lista que está tratando de eliminar, debe poner la siguiente condición

if (context.entity.contains (su objeto))

eliminarlo

si tiene una condición complicada para la igualdad , debe anular el método igual en la clase de entidad para poner su condición de igualdad, para obtener el camino correcto para un método de extensión “entidad.contiene”

Asegúrese de que el modelo que pasa a Eliminar (Entidad) es exactamente igual que el registro de la base de datos.

Algunas veces es posible pasar el modelo sin algunos campos como Id o Fecha. mantenlos en @ html.Hiddenfor si publicas como formulario.

La mejor manera es pasar el ID y obtener la entidad utilizando el método Find (Id) y pasarlo a Remove (Entity)

Espero que esto ayude a alguien.