我需要使用实体框架中的 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();
该线程值得一个可行的答案。这就是你可以做的(EF 6)
using (var context = new ApplicationDbContext())
{
var subs = context.Subscriptions
.Where(x => x.Client == myClient)
.ToList();
context.Subscriptions.RemoveRange(subs);
await context.SaveChangesAsync();
}