如何在不使用 SQL 的情况下使用实体框架高效删除表中的所有记录?

问题描述 投票:0回答:3

我需要使用实体框架中的 DbContext 删除给定表中的所有记录。我需要它是可移植的,因此它不能依赖于 SQL 语句或存储过程。我已经查看了这个问题的答案,但由于各种原因,没有一个符合我的要求,也不是理想的解决方案。

我可以使用RemoveRange方法,即

DbContext.Table.RemoveRange(all);

但是这不能很好地扩展,因为它在删除之前选择所有条目,这对于实体框架来说可能需要很长很长的时间。迭代每条记录并使用Remove(record)单独删除它们也有同样的问题。

使用 SQL,这很简单,使用 TRUNCATE 命令。即使是简单的 DELETE FROM [TableName] 命令也可以工作,但我不知道它的可扩展性如何。

是否有任何解决方案仅使用实体框架(无SQL),并且不需要在删除它们之前先选择所有记录?

c# .net entity-framework entity-framework-core
3个回答
1
投票

目前使用实体框架无法实现这一点。请参阅https://github.com/dotnet/efcore/issues/795

可能有一个扩展可以让你做到这一点,但我不确定它是否适用于所有 RDBMS 系统。


0
投票

假设您有 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();

0
投票

该线程值得一个可行的答案。这就是你可以做的(EF 6)

using (var context = new ApplicationDbContext())
{
    var subs = context.Subscriptions
        .Where(x => x.Client == myClient)
        .ToList();

    context.Subscriptions.RemoveRange(subs);
    await context.SaveChangesAsync();
}
© www.soinside.com 2019 - 2024. All rights reserved.