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
- La cantidad de datos es pequeña o
- El rendimiento no importa
Simplemente llame:
VotingContext.Votes.RemoveRange(VotingContext.Votes);
Suponiendo este contexto:
public class VotingContext : DbContext
{
public DbSet<Vote> Votes{get;set;}
public DbSet<Poll> Polls{get;set;}
public DbSet<Voter> Voters{get;set;}
public DbSet<Candidacy> Candidates{get;set;}
}
Para el código más ordenado, puede declarar el siguiente método de extensión:
public static class EntityExtensions
{
public static void Clear<T>(this DbSet<T> dbSet) where T : class
{
dbSet.RemoveRange(dbSet);
}
}
Entonces lo anterior se convierte en:
VotingContext.Votes.Clear();
VotingContext.Voters.Clear();
VotingContext.Candidacy.Clear();
VotingContext.Polls.Clear();
await VotingTestContext.SaveChangesAsync();
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?
- EF obtendrá TODAS las filas (VotingContext.Votes)
- y luego usarán sus ID (no estoy seguro exactamente cómo, no importa), para eliminarlos.
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.
TRUNCATE
adeptos se preocupa por las restricciones de claves externas.