![](/img/trans.png)
[英]How can I delete records in Entity Framework using ExecuteSqlCommand?
[英]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.