¿Cómo puedo eliminar rápidamente todas las filas de la tabla con Entity Framework?
Actualmente estoy usando:
var rows = from o in dataDb.Table
select o;
foreach (var row in rows)
{
dataDb.Table.Remove(row);
}
dataDb.SaveChanges();
Sin embargo, lleva mucho tiempo ejecutarlo.
¿Hay alguna alternativa?
c#
sql
linq
entity-framework
Zhenia
fuente
fuente
TRUNCATE
adeptos se preocupa por las restricciones de claves externas.[TableName]
, no es portátil.Respuestas:
Para aquellos que están buscando en Google esto y terminaron aquí como yo, así es como lo haces actualmente en EF5 y EF6:
Suponiendo que el contexto es un
System.Data.Entity.DbContext
fuente
[
escapes aquí son específicos de SQL Server, elTRUNCATE
comando no lo es: es parte de ANSI SQL y, por lo tanto, funcionará en la mayoría de los dialectos de SQL (aunque no SQLite).Advertencia: lo siguiente solo es adecuado para tablas pequeñas (piense <1000 filas)
Aquí hay una solución que usa el marco de entidad (no SQL) para eliminar las filas, por lo que no es específico del motor SQL (R / DBM).
Esto supone que está haciendo esto para probar o alguna situación similar. Ya sea
Simplemente llame:
Suponiendo este contexto:
Para el código más ordenado, puede declarar el siguiente método de extensión:
Entonces lo anterior se convierte en:
Recientemente utilicé este enfoque para limpiar mi base de datos de prueba para cada ejecución de caso de prueba (obviamente es más rápido que recrear la base de datos desde cero cada vez, aunque no verifiqué la forma de los comandos de eliminación que se generaron).
¿Por qué puede ser lento?
Entonces, si está trabajando con una gran cantidad de datos, matará el proceso del servidor SQL (consumirá toda la memoria) y lo mismo para el proceso IIS, ya que EF almacenará en caché todos los datos de la misma manera que el servidor SQL. No use este si su tabla contiene una gran cantidad de datos.
fuente
Usar el
TRUNCATE TABLE
comando de SQL será el más rápido ya que opera en la tabla y no en filas individuales.Suponiendo que
dataDb
es unDbContext
(no unObjectContext
), puede envolverlo y usar el método de esta manera:fuente
TRUNCATE TABLE
aDELETE FROM
fuente
o
fuente
Delete
deIQueryable
- supongo Manish estaba usando algo así como EntityFramework.Extended: github.com/loresoft/EntityFramework.Extended.Delete
era una extensión personalizada y en el momento de publicar la respuesta primero, se olvidó por completo de mencionar la definición de esta costumbre.Delete
. :)Puedes hacerlo sin Foreach
Esto eliminará todas las filas
fuente
Esto evita usar cualquier sql
fuente
Me encontré con esta pregunta cuando tuve que lidiar con un caso particular: la actualización completa del contenido en una tabla de "hojas" (sin que los FK lo señalaran). Esto implicó la eliminación de todas las filas y la colocación de información de filas nuevas y debe hacerse transaccionalmente (no quiero terminar con una tabla vacía, si las inserciones fallan por alguna razón).
He intentado el
public static void Clear<T>(this DbSet<T> dbSet)
enfoque, pero no se insertan nuevas filas. Otra desventaja es que todo el proceso es lento, ya que las filas se eliminan una por una.Entonces, cambié a
TRUNCATE
enfoque, ya que es mucho más rápido y también es ROLLBACKable . También restablece la identidad.Ejemplo usando patrón de repositorio:
Por supuesto, como ya se mencionó, esta solución no puede ser utilizada por tablas referenciadas por claves foráneas (falla TRUNCATE).
fuente
Cannot truncate table because it is being referenced by a FOREIGN KEY constraint
), incluso si están vacías, por lo que los FK deben descartarse y recrearse para poder utilizarlos deTRUNCATE
todos modos.Si
causas
No se puede truncar la tabla 'MyTable' porque está siendo referenciada por una restricción FOREIGN KEY.
Yo uso esto :
fuente
fuente
Si desea borrar toda su base de datos.
Debido a las restricciones de clave externa, importa qué secuencia se truncan las tablas. Esta es una forma de aplicar fuerza bruta a esta secuencia.
uso:
recuerde reinstalar su DbContext después de esto.
fuente
Lo siguiente funciona en la base de datos SQLite (usando Entity Framework)
Parece que la forma más rápida de borrar todas las tablas de db es usando 'context.Database.ExecuteSqlCommand ("some SQL")', como también se resaltaron algunos comentarios anteriores. Aquí voy a mostrar cómo restablecer el recuento de 'índice' de tablas también.
Un punto importante es que si usa claves foráneas en sus tablas, primero debe eliminar la tabla secundaria antes que la tabla primaria, por lo que la secuencia (jerarquía) de las tablas durante la eliminación es importante, de lo contrario puede ocurrir una excepción SQLite.
Nota: var context = new YourContext ()
fuente
Esto funciona correctamente en EF 5:
fuente
En EFCore (la versión que estoy usando es la 3.1) puede usar lo siguiente para eliminar todas las filas:
fuente
Eliminar todos los registros. No restablezca el índice primario como "truncar".
fuente
En mi código, realmente no tenía un buen acceso al objeto de la base de datos, por lo que puede hacerlo en el DbSet donde también se le permite usar cualquier tipo de sql. De alguna manera terminará así:
fuente
Si MVC, puedes hacer:
fuente
Asegúrese de que cuando intente eliminar el elemento primario, todos los elementos secundarios se eliminarán en cascada. O los niños tienen clave foránea anulable.
fuente
fuente