警告:以下は小さなテーブルにのみ適しています(1000行未満と考えてください)。
エンティティフレームワーク(SQLではなく)を使用して行を削除するソリューションは、SQLエンジン(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();
私は最近、このアプローチを使用して、テストケースの実行ごとにテストデータベースをクリーンアップしました(生成された削除コマンドの形式を確認していませんが、毎回DBを最初から再作成するよりも明らかに高速です)。
なぜ遅いのでしょうか?
- EFはすべての行を取得します(VotingContext.Votes)
- 次に、それらのIDを使用して(正確にはわからない、重要ではありません)、それらを削除します。
したがって、EFがすべてのデータをSQLサーバーと同じ方法でキャッシュするため、深刻な量のデータを処理している場合は、SQLサーバープロセスを強制終了し(すべてのメモリを消費します)、IISプロセスと同じことになります。テーブルに大量のデータが含まれている場合は、これを使用しないでください。
TRUNCATE
熟練者の誰もが外部キーの制約について心配しないのはなぜでしょうか。