簡體   English   中英

如何在不使用 SQL 的情況下使用實體框架有效地刪除表中的所有記錄?

[英]How can I efficiently delete all records in a table using Entity Framework without using SQL?

我需要使用實體框架中的 DbContext 刪除給定表中的所有記錄。 我需要它是可移植的,所以它不能依賴 SQL 語句或存儲過程。 我已經查看了這個問題的答案,但由於各種原因,它們都不符合我的要求或者是理想的解決方案。

我可以使用 RemoveRange 方法,即

DbContext.Table.RemoveRange(all);

但這並不能很好地擴展,因為它會在刪除之前選擇所有條目,這對於實體框架可能需要很長時間。 遍歷每條記錄並使用 Remove(record) 單獨刪除它們具有相同的問題。

使用 SQL 這很簡單,使用 TRUNCATE 命令。 即使是一個簡單的 DELETE FROM [TableName] 命令也可以,但我不知道它的可擴展性如何。

有沒有只使用實體框架(無 SQL)的解決方案,並且不需要在刪除它們之前先選擇所有記錄?

這是目前使用實體框架無法實現的。 https://github.com/dotnet/efcore/issues/795

可能有一個擴展可以讓你這樣做,但我不確定它是否適用於所有 RDBMS 系統。

假設您有 BrandData 表,其中包含一些品牌的記錄:

public class BrandData
    {
        [Key]
        public int Id { get; set; }

        public string Name { get; set; }

        public string Description { get; set; }
    }

您還創建了一個 dbcontext:

public class MyDbContext : DbContext
    {
        public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
        {
            Database.Migrate();
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<BrandData>().HasData(new BrandData { Id = 999, Name = "LG", Description = "TV brand" });
            
        }
        public DbSet<BrandData> BrandData { get; set; }

    }

最后,這是通過 ID 刪除品牌的方法:

public async Task DeleteModelAsync(int id)
        {
            var data = _dbContext.ModelData.FirstOrDefault(b => b.Id == id);
            if (data != null)
            {
                _dbContext.ModelData.Remove(data);
                await _dbContext.SaveChangesAsync();
            }
        }

更改將在 SaveChangesAsync() 方法運行后完成。

更新

要刪除所有記錄:

    var brands = await _dbContext.BrandData.ToListAsync();
    
                    foreach(var brand in brands)
                    {
                        _dbContext.BrandData.Remove(brand);
                    }

    await _dbContext.SaveChangesAsync();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM