Warnung: Das Folgende ist nur für kleine Tabellen geeignet (denken Sie an <1000 Zeilen).
Hier ist eine Lösung, die das Entity Framework (nicht SQL) zum Löschen der Zeilen verwendet, sodass sie nicht SQL Engine (R / DBM) -spezifisch ist.
Dies setzt voraus, dass Sie dies zum Testen oder in einer ähnlichen Situation tun. Entweder
- Die Datenmenge ist gering oder
- Die Leistung spielt keine Rolle
Rufen Sie einfach an:
VotingContext.Votes.RemoveRange(VotingContext.Votes);
Unter der Annahme dieses Kontextes:
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;}
}
Für aufgeräumten Code können Sie die folgende Erweiterungsmethode deklarieren:
public static class EntityExtensions
{
public static void Clear<T>(this DbSet<T> dbSet) where T : class
{
dbSet.RemoveRange(dbSet);
}
}
Dann wird das Obige:
VotingContext.Votes.Clear();
VotingContext.Voters.Clear();
VotingContext.Candidacy.Clear();
VotingContext.Polls.Clear();
await VotingTestContext.SaveChangesAsync();
Ich habe diesen Ansatz kürzlich verwendet, um meine Testdatenbank für jeden Testfalllauf zu bereinigen (es ist offensichtlich schneller, als die Datenbank jedes Mal von Grund auf neu zu erstellen, obwohl ich die Form der generierten Löschbefehle nicht überprüft habe).
Warum kann es langsam sein?
- EF erhält ALLE Zeilen (VotingContext.Votes)
- und verwenden dann ihre IDs (nicht sicher, wie, egal), um sie zu löschen.
Wenn Sie also mit einer großen Datenmenge arbeiten, beenden Sie den SQL Server-Prozess (er verbraucht den gesamten Speicher) und das Gleiche für den IIS-Prozess, da EF alle Daten auf die gleiche Weise wie SQL Server zwischenspeichert. Verwenden Sie diese nicht, wenn Ihre Tabelle ernsthafte Datenmengen enthält.
TRUNCATE
Adepten Sorgen um Fremdschlüsseleinschränkungen macht.