Bagaimana saya bisa menghapus semua baris dalam tabel dengan cepat menggunakan Entity Framework?
Saat ini saya menggunakan:
var rows = from o in dataDb.Table
select o;
foreach (var row in rows)
{
dataDb.Table.Remove(row);
}
dataDb.SaveChanges();
Namun, butuh waktu lama untuk dieksekusi.
Apakah ada alternatif lain?
c#
sql
linq
entity-framework
Zhenia
sumber
sumber
TRUNCATE
pakar ini khawatir tentang batasan kunci asing.[TableName]
, itu tidak portabel.Jawaban:
Bagi mereka yang googling ini dan berakhir di sini seperti saya, ini adalah bagaimana Anda melakukannya di EF5 dan EF6:
Dengan asumsi konteksnya adalah a
System.Data.Entity.DbContext
sumber
[
lolos di sini khusus untuk SQL Server,TRUNCATE
perintahnya tidak - itu bagian dari ANSI SQL dan akan bekerja di sebagian besar dialek SQL (meskipun bukan SQLite).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
Cukup telepon:
Dengan asumsi konteks ini:
Untuk kode yang lebih rapi, Anda dapat mendeklarasikan metode ekstensi berikut:
Maka di atas menjadi:
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?
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.
sumber
Menggunakan
TRUNCATE TABLE
perintah SQL akan menjadi yang tercepat karena beroperasi di atas meja dan bukan pada baris individual.Dengan asumsi
dataDb
adalahDbContext
(bukan anObjectContext
), Anda dapat membungkusnya dan menggunakan metode seperti ini:sumber
TRUNCATE TABLE
keDELETE FROM
sumber
atau
sumber
Delete
diIQueryable
- Saya menduga Manish menggunakan sesuatu seperti EntityFramework.Extended: github.com/loresoft/EntityFramework.Extended.Delete
adalah ekstensi khusus dan dalam panasnya memposting jawabannya, benar-benar lupa menyebutkan definisi kustom ini.Delete
. :)Anda dapat melakukannya tanpa Foreach
Ini akan menghapus semua baris
sumber
Ini menghindari penggunaan sql apa pun
sumber
Saya menemukan pertanyaan ini ketika saya harus berurusan dengan kasus tertentu: memperbarui konten sepenuhnya dalam tabel "daun" (tidak ada FK menunjuk ke sana). Ini melibatkan menghapus semua baris dan meletakkan informasi baris baru dan itu harus dilakukan secara transaksi (saya tidak ingin berakhir dengan tabel kosong, jika memasukkan gagal karena alasan apa pun).
Saya sudah mencoba
public static void Clear<T>(this DbSet<T> dbSet)
pendekatannya, tetapi baris baru tidak dimasukkan. Kelemahan lain adalah bahwa seluruh proses lambat, karena baris dihapus satu per satu.Jadi, saya telah beralih ke
TRUNCATE
pendekatan, karena jauh lebih cepat dan juga ROLLBACKable . Ini juga mengatur ulang identitas.Contoh menggunakan pola repositori:
Tentu saja, seperti yang telah disebutkan, solusi ini tidak dapat digunakan oleh tabel yang dirujuk oleh kunci asing (TRUNCATE gagal).
sumber
Cannot truncate table because it is being referenced by a FOREIGN KEY constraint
), bahkan jika mereka kosong, sehingga FK harus dijatuhkan dan diciptakan kembali agar dapat digunakanTRUNCATE
.jika
penyebab
Tidak dapat memotong tabel 'MyTable' karena sedang direferensikan oleh batasan KUNCI ASING.
Saya menggunakan ini:
sumber
sumber
Jika Anda ingin menghapus seluruh basis data Anda.
Karena batasan kunci asing, penting urutan tabel mana yang terpotong. Ini adalah cara untuk menguatkan urutan ini.
pemakaian:
jangan lupa untuk mengembalikan konteks DbContext Anda setelah ini.
sumber
Berikut ini berfungsi pada database SQLite (menggunakan Entity Framework)
Tampaknya cara tercepat untuk menghapus semua tabel db menggunakan 'context.Database.ExecuteSqlCommand ("some SQL")', karena beberapa komentar di atas juga disorot. Di sini saya akan menunjukkan cara mengatur ulang jumlah tabel 'indeks' juga.
Satu poin penting adalah bahwa jika Anda menggunakan kunci asing di tabel Anda, Anda harus terlebih dahulu menghapus tabel anak sebelum tabel induk, sehingga urutan (hierarki) tabel selama penghapusan adalah penting, jika tidak, pengecualian SQLite dapat terjadi.
Catatan: var context = newContext Anda ()
sumber
Ini berfungsi dengan baik di EF 5:
sumber
Di EFCore (versi yang saya gunakan adalah 3.1) Anda dapat menggunakan yang berikut untuk menghapus semua baris -
sumber
Hapus semua catatan. Jangan mengatur ulang indeks utama seperti "truncate".
sumber
Dalam kode saya, saya tidak benar-benar memiliki akses bagus ke objek Database, sehingga Anda dapat melakukannya pada DbSet di mana Anda juga diizinkan untuk menggunakan segala jenis sql. Ini akan berakhir seperti ini:
sumber
Jika MVC, Anda dapat melakukan:
sumber
Pastikan ketika Anda mencoba untuk menghapus orangtua semua anak akan mengalir pada penghapusan. Atau anak-anak memiliki kunci asing yang dapat dibatalkan.
sumber
sumber