tutorial paginacion net mvc framework first español con code asp and asp.net-mvc entity-framework linq-to-entities

asp.net mvc - paginacion - ¿Cómo elimino un objeto de un modelo de Entity Framework sin cargarlo primero?



mvc entity framework español (7)

Con Entity Framework 5 existe Entity Framework Extended Library . Disponible en NuGet. Entonces puedes escribir algo como:

context.Users.Delete(u => u.Id == id);

También es útil para eliminaciones masivas.

Estoy bastante seguro de haber visto la respuesta a esta pregunta en alguna parte, pero como no pude encontrarla con un par de búsquedas en SO o en Google, de todos modos lo vuelvo a preguntar ...

En Entity Framework, la única forma de eliminar un objeto de datos parece ser

MyEntityModel ent = new MyEntityModel(); ent.DeleteObject(theObjectToDelete); ent.SaveChanges();

Sin embargo, este enfoque requiere que el objeto se cargue, en este caso, el controlador primero, solo para eliminarlo. ¿Hay alguna manera de eliminar un objeto comercial haciendo referencia solo a su ID, por ejemplo?

Si hay una forma más inteligente de usar expresiones Linq o Lambda, eso también está bien. El objetivo principal, sin embargo, es evitar cargar datos solo para eliminarlos.


Disculpas de antemano, pero tengo que cuestionar tu objetivo.

Si elimina un objeto sin leerlo nunca, no podrá saber si otro usuario ha cambiado el objeto entre la fecha en que confirmó que deseaba eliminar el objeto y la eliminación real. En "plain old SQL", esto sería como hacer:

DELETE FROM FOO WHERE ID = 1234

Por supuesto, la mayoría de la gente no hace esto. En cambio, hacen algo como:

DELETE FROM FOO WHERE ID = 1234 AND NAME = ?ExpectedName AND...

El punto es que la eliminación debería fallar (no hacer nada) si otro usuario ha cambiado el registro mientras tanto.

Con esto, una mejor declaración del problema, hay dos soluciones posibles cuando se utiliza el Entity Framework.

  1. En su método Delete, la instancia existente, compare los valores esperados de las propiedades y elimine si son iguales. En este caso, Entity Framework se encargará de escribir una declaración DELETE que incluye los valores de las propiedades.

  2. Escriba un procedimiento almacenado que acepte tanto el IDE como los otros valores de propiedad y ejecútelo.


Encontré esta publicación , que dice que realmente no hay una mejor manera de eliminar registros. La explicación dada fue que todas las claves externas, relaciones, etc. que son únicas para este registro también se eliminan, por lo que EF necesita tener la información correcta sobre el registro. Estoy desconcertado por qué esto no podría lograrse sin cargar datos de un lado a otro, pero como no va a suceder muy a menudo, he decidido (por ahora) que no me molestaré.

Si tienes una solución a este problema, no dudes en decirme =)


Hay una forma de falsificar una entidad volviendo a calcular su EntityKey. Parece un truco, pero podría ser la única forma de hacerlo en EF.

Artículo del blog sobre cómo eliminar sin recuperar


Puede crear un objeto con la misma identificación y pasarlo a la eliminación PERO es bueno para objetos simples, si tiene relaciones complejas puede necesitar más que eso

var user = new User { ID = 15 }; context.Entry(user).State = EntityState.Deleted; context.SaveChanges();


Vale la pena saber que Entity Framework es compatible tanto con Linq como con Entities y Entity SQL. Si desea hacer eliminaciones o actualizaciones que podrían afectar muchos registros, puede usar el equivalente de ExecuteNonQuery .

En Entity SQL esto podría parecerse

Using db As New HelloEfEntities Dim qStr = "Delete " & _ "FROM Employee" db.ExecuteStoreCommand(qStr) db.SaveChanges() End Using

En este ejemplo, db es mi ObjectContext . También tenga en cuenta que la función ExecuteStoreCommand toma una matriz opcional de parámetros.


var toDelete = new MyEntityModel{ GUID = guid, //or ID = id, depending on the key }; Db.MyEntityModels.Attach(toDelete); Db.MyEntityModels.DeleteObject(toDelete); Db.SaveChanges();

En caso de que su clave contenga varias columnas, debe proporcionar todos los valores (por ejemplo, GUID, columnaX, columna, etc.).

También busque here una función genérica si siente algo elegante.