Avvertenza: quanto segue è adatto solo per piccole tabelle (si pensi a <1000 righe)
Ecco una soluzione che utilizza il framework di entità (non SQL) per eliminare le righe, quindi non è specifico di SQL Engine (R / DBM).
Questo presuppone che tu lo stia facendo per un test o una situazione simile. O
- La quantità di dati è piccola o
- Le prestazioni non contano
Chiama semplicemente:
VotingContext.Votes.RemoveRange(VotingContext.Votes);
Supponendo questo contesto:
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;}
}
Per il codice più ordinato puoi dichiarare il seguente metodo di estensione:
public static class EntityExtensions
{
public static void Clear<T>(this DbSet<T> dbSet) where T : class
{
dbSet.RemoveRange(dbSet);
}
}
Quindi quanto sopra diventa:
VotingContext.Votes.Clear();
VotingContext.Voters.Clear();
VotingContext.Candidacy.Clear();
VotingContext.Polls.Clear();
await VotingTestContext.SaveChangesAsync();
Recentemente ho usato questo approccio per ripulire il mio database di test per ogni esecuzione di testcase (ovviamente è più veloce che ricreare il DB da capo ogni volta, anche se non ho controllato la forma dei comandi di eliminazione che sono stati generati).
Perché può essere lento?
- EF otterrà TUTTE le righe (VotingContext.Votes)
- e poi useranno i loro ID (non sono sicuro di come, non importa), per eliminarli.
Quindi, se stai lavorando con una grande quantità di dati, ucciderai il processo del server SQL (consumerà tutta la memoria) e la stessa cosa per il processo IIS poiché EF memorizzerà nella cache tutti i dati allo stesso modo del server SQL. Non usare questo se la tua tabella contiene una grande quantità di dati.
TRUNCATE
adepti si preoccupi dei vincoli delle chiavi esterne.