Peringatan: Berikut ini hanya cocok untuk tabel kecil (pikirkan <1000 baris)
Berikut ini adalah solusi yang menggunakan kerangka kerja entitas (bukan SQL) untuk menghapus baris, sehingga tidak spesifik untuk SQL Engine (R / DBM).
Ini mengasumsikan bahwa Anda melakukan ini untuk pengujian atau situasi serupa. Antara
- Jumlah data kecil atau
- Performanya tidak masalah
Cukup telepon:
VotingContext.Votes.RemoveRange(VotingContext.Votes);
Dengan asumsi konteks ini:
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;}
}
Untuk kode yang lebih rapi, Anda dapat mendeklarasikan metode ekstensi berikut:
public static class EntityExtensions
{
public static void Clear<T>(this DbSet<T> dbSet) where T : class
{
dbSet.RemoveRange(dbSet);
}
}
Maka di atas menjadi:
VotingContext.Votes.Clear();
VotingContext.Voters.Clear();
VotingContext.Candidacy.Clear();
VotingContext.Polls.Clear();
await VotingTestContext.SaveChangesAsync();
Saya baru-baru ini menggunakan pendekatan ini untuk membersihkan database pengujian saya untuk setiap proses testcase (ini jelas lebih cepat daripada menciptakan kembali DB dari awal setiap kali, meskipun saya tidak memeriksa bentuk perintah delete yang dihasilkan).
Mengapa bisa lambat?
- EF akan mendapatkan SEMUA baris (VotingContext.Votes)
- dan kemudian akan menggunakan ID mereka (tidak yakin persis bagaimana, tidak masalah), untuk menghapusnya.
Jadi jika Anda bekerja dengan jumlah data yang serius Anda akan mematikan proses SQL server (itu akan menghabiskan semua memori) dan hal yang sama untuk proses IIS karena EF akan men-cache semua data dengan cara yang sama seperti SQL server. Jangan gunakan yang ini jika tabel Anda mengandung jumlah data yang serius.
TRUNCATE
pakar ini khawatir tentang batasan kunci asing.