Aviso: O seguinte é adequado apenas para tabelas pequenas (pense <1000 linhas)
Aqui está uma solução que usa a estrutura da entidade (não o SQL) para excluir as linhas, portanto, não é específico do SQL Engine (R / DBM).
Isso pressupõe que você esteja fazendo isso para testes ou situações semelhantes. Ou
- A quantidade de dados é pequena ou
- O desempenho não importa
Basta ligar para:
VotingContext.Votes.RemoveRange(VotingContext.Votes);
Assumindo 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 código mais organizado, você pode declarar o seguinte método de extensão:
public static class EntityExtensions
{
public static void Clear<T>(this DbSet<T> dbSet) where T : class
{
dbSet.RemoveRange(dbSet);
}
}
Então o acima se torna:
VotingContext.Votes.Clear();
VotingContext.Voters.Clear();
VotingContext.Candidacy.Clear();
VotingContext.Polls.Clear();
await VotingTestContext.SaveChangesAsync();
Recentemente, usei essa abordagem para limpar meu banco de dados de teste para cada execução do caso de teste (é obviamente mais rápido do que recriar o banco de dados a partir do zero a cada vez, embora eu não tenha verificado a forma dos comandos de exclusão que foram gerados).
Por que isso pode ser lento?
- A EF obterá TODAS as linhas (VotingContext.Votes)
- e, em seguida, usará seus IDs (não sei exatamente como, não importa), para excluí-los.
Portanto, se você estiver trabalhando com uma quantidade séria de dados, você matará o processo do servidor SQL (ele consumirá toda a memória) e a mesma coisa para o processo IIS, já que o EF armazenará todos os dados da mesma maneira que o servidor SQL. Não use este se sua tabela contiver uma quantidade séria de dados.
TRUNCATE
adeptos se preocupa com restrições de chave estrangeira.