Предупреждение: следующее подходит только для небольших таблиц (например, <1000 строк)
Вот решение, которое использует структуру сущностей (не SQL) для удаления строк, поэтому оно не является специфичным для SQL Engine (R / DBM).
Это предполагает, что вы делаете это для тестирования или какой-то подобной ситуации. Либо
- Количество данных мало или
- Производительность не имеет значения
Просто позвоните:
VotingContext.Votes.RemoveRange(VotingContext.Votes);
Предполагая этот контекст:
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;}
}
Для более простого кода вы можете объявить следующий метод расширения:
public static class EntityExtensions
{
public static void Clear<T>(this DbSet<T> dbSet) where T : class
{
dbSet.RemoveRange(dbSet);
}
}
Тогда выше становится:
VotingContext.Votes.Clear();
VotingContext.Voters.Clear();
VotingContext.Candidacy.Clear();
VotingContext.Polls.Clear();
await VotingTestContext.SaveChangesAsync();
Недавно я использовал этот подход для очистки своей тестовой базы данных при каждом запуске тестового набора (это, очевидно, быстрее, чем воссоздание БД с нуля каждый раз, хотя я не проверял форму сгенерированных команд удаления).
Почему это может быть медленным?
- EF получит ВСЕ строки (VotingContext.Votes)
- а затем будет использовать их идентификаторы (не знаю точно, как, не имеет значения), чтобы удалить их.
Поэтому, если вы работаете с серьезным объемом данных, вы убьете процесс сервера SQL (он будет занимать всю память) и то же самое для процесса IIS, поскольку EF будет кэшировать все данные так же, как сервер SQL. Не используйте этот, если ваша таблица содержит серьезный объем данных.
TRUNCATE
адептов не беспокоится об ограничениях внешнего ключа.