คำเตือน:ต่อไปนี้เหมาะสำหรับตารางเล็ก ๆ เท่านั้น (คิดว่า <1,000 แถว)
นี่คือโซลูชันที่ใช้เฟรมเวิร์กเอนทิตี (ไม่ใช่ 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)
- จากนั้นจะใช้ ID ของพวกเขา (ไม่แน่ใจว่าจะทำอย่างไรไม่สำคัญ) ในการลบพวกเขา
ดังนั้นหากคุณทำงานกับข้อมูลจำนวนมากคุณจะฆ่ากระบวนการเซิร์ฟเวอร์ SQL (มันจะใช้หน่วยความจำทั้งหมด) และสิ่งเดียวกันสำหรับกระบวนการ IIS เนื่องจาก EF จะแคชข้อมูลทั้งหมดเช่นเดียวกับเซิร์ฟเวอร์ SQL อย่าใช้อันนี้หากตารางของคุณมีข้อมูลจำนวนมาก
TRUNCATE
adepts เหล่านี้กังวลเกี่ยวกับข้อ จำกัด ของรหัสต่างประเทศ