Cảnh báo: Phần sau chỉ phù hợp với các bảng nhỏ (nghĩ <1000 hàng)
Đây là một giải pháp sử dụng khung thực thể (không phải SQL) để xóa các hàng, vì vậy nó không phải là SQL Engine (R / DBM) cụ thể.
Điều này giả định rằng bạn đang làm điều này để thử nghiệm hoặc một số tình huống tương tự. Hoặc
- Lượng dữ liệu nhỏ hoặc
- Hiệu suất không thành vấn đề
Chỉ cần gọi:
VotingContext.Votes.RemoveRange(VotingContext.Votes);
Giả sử bối cảnh này:
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;}
}
Đối với mã gọn hơn, bạn có thể khai báo phương thức mở rộng sau:
public static class EntityExtensions
{
public static void Clear<T>(this DbSet<T> dbSet) where T : class
{
dbSet.RemoveRange(dbSet);
}
}
Sau đó, những điều trên trở thành:
VotingContext.Votes.Clear();
VotingContext.Voters.Clear();
VotingContext.Candidacy.Clear();
VotingContext.Polls.Clear();
await VotingTestContext.SaveChangesAsync();
Gần đây tôi đã sử dụng cách tiếp cận này để dọn sạch cơ sở dữ liệu thử nghiệm của mình cho mỗi lần chạy thử nghiệm (nó rõ ràng nhanh hơn so với việc tạo lại DB từ đầu mỗi lần, mặc dù tôi đã không kiểm tra hình thức của các lệnh xóa được tạo).
Tại sao nó có thể chậm?
- EF sẽ nhận được TẤT CẢ các hàng (VotesContext.Votes)
- và sau đó sẽ sử dụng ID của họ (không chắc chắn chính xác như thế nào, không quan trọng), để xóa chúng.
Vì vậy, nếu bạn đang làm việc với lượng dữ liệu nghiêm trọng, bạn sẽ giết quá trình máy chủ SQL (nó sẽ tiêu tốn toàn bộ bộ nhớ) và điều tương tự cho quy trình IIS vì EF sẽ lưu trữ tất cả dữ liệu giống như máy chủ SQL. Không sử dụng cái này nếu bảng của bạn chứa lượng dữ liệu nghiêm trọng.
TRUNCATE
lo lắng về các ràng buộc khóa ngoại.