繁体   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