Uyarı: Aşağıdaki sadece küçük tablolar için uygundur (<1000 satır düşünün)
İşte satırları silmek için varlık çerçevesi (SQL değil) kullanan bir çözüm, bu nedenle SQL Engine (R / DBM) özgü değildir.
Bu, bunu test etmek veya benzer bir durum için yaptığınızı varsayar. ya
- Veri miktarı az veya
- Performansın önemi yok
Sadece arayın:
VotingContext.Votes.RemoveRange(VotingContext.Votes);
Bu bağlamı varsayarsak:
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;}
}
Düzen kodu için aşağıdaki uzantı yöntemini bildirebilirsiniz:
public static class EntityExtensions
{
public static void Clear<T>(this DbSet<T> dbSet) where T : class
{
dbSet.RemoveRange(dbSet);
}
}
Sonra yukarıdakiler olur:
VotingContext.Votes.Clear();
VotingContext.Voters.Clear();
VotingContext.Candidacy.Clear();
VotingContext.Polls.Clear();
await VotingTestContext.SaveChangesAsync();
Son zamanlarda bu yaklaşımı her testcase çalıştırması için test veritabanımı temizlemek için kullandım.
Neden yavaş olabilir?
- EF TÜM satırları alacak (VotingContext.Votes)
- ve daha sonra kimlikleri silmek için kimliklerini kullanır (tam olarak nasıl, önemli değil).
Dolayısıyla ciddi miktarda veri ile çalışıyorsanız, EF tüm verileri SQL sunucusuyla aynı şekilde önbelleğe alacağından, SQL sunucusu işlemini (tüm belleği tüketir) ve IIS işlemi için aynı şeyi öldürürsünüz. Tablonuzda ciddi miktarda veri varsa bunu kullanmayın.
TRUNCATE
ustaların hiçbirinin yabancı anahtar kısıtlamaları için neden endişelenmediğini merak ediyorum .