Попередження: наведене нижче підходить лише для невеликих таблиць (думайте, <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;}
}
Для коду Tidier ви можете оголосити наступний метод розширення:
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
адептів не турбується про зовнішні ключові обмеження.