C# 如何在不使用SQL的情况下使用实体框架高效地删除表中的所有记录?
我需要在实体框架中使用DbContext删除给定表中的所有记录。我需要它是可移植的,所以它不能依赖SQL语句或存储过程。我已经看过了的答案,但没有一个符合我的要求,或者是出于各种原因的理想解决方案 我可以使用Removatange方法,即C# 如何在不使用SQL的情况下使用实体框架高效地删除表中的所有记录?,c#,.net,entity-framework,entity-framework-core,C#,.net,Entity Framework,Entity Framework Core,我需要在实体框架中使用DbContext删除给定表中的所有记录。我需要它是可移植的,所以它不能依赖SQL语句或存储过程。我已经看过了的答案,但没有一个符合我的要求,或者是出于各种原因的理想解决方案 我可以使用Removatange方法,即 DbContext.Table.RemoveRange(all); 但这并不能很好地扩展,因为它会在删除之前选择所有条目,而使用实体框架可能需要很长很长时间。迭代每个记录并使用Remove(record)单独删除它们也有相同的问题 使用SQL这很简单,使用T
DbContext.Table.RemoveRange(all);
但这并不能很好地扩展,因为它会在删除之前选择所有条目,而使用实体框架可能需要很长很长时间。迭代每个记录并使用Remove(record)单独删除它们也有相同的问题
使用SQL这很简单,使用TRUNCATE命令。即使是一个简单的从[TableName]删除的命令也能工作,但我不知道它的可伸缩性有多大
是否有任何解决方案只使用实体框架(无SQL),并且在删除记录之前不需要先选择所有记录?这在当前使用实体框架是不可能的。看
可能有一个扩展允许您这样做,但我不确定它是否适用于所有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; }
}
将在saveChangesSync()方法运行后进行更改
更新
要删除所有记录,请执行以下操作:
var brands = await _dbContext.BrandData.ToListAsync();
foreach(var brand in brands)
{
_dbContext.BrandData.Remove(brand);
}
await _dbContext.SaveChangesAsync();
“所以它不能依赖SQL语句”-TRUNCATE TABLE似乎是安全的enough@MitchWheatTRUNCATE TABLE是一个SQL语句。你也会注意到,我链接到了你链接到的那个问题,并在那里阅读了答案。比如,“如果答案在带有方括号的SQL语句中引用表名(如:[TableName]),它是不可移植的。”我知道这是一个SQL语句!哈哈,我是说给我看一个不支持截断表tablename的RDBMS;'我不同意你只能用一种方式做事的观点。哇,那条GitHub线真是一场恐怖秀。六年后,一个对几乎所有基于数据库的应用程序都有用的特性“可能成为下一个版本的高优先级特性”。。。听起来我需要看看第三部分的扩展,看看什么可以伸缩地满足我的需求
var brands = await _dbContext.BrandData.ToListAsync();
foreach(var brand in brands)
{
_dbContext.BrandData.Remove(brand);
}
await _dbContext.SaveChangesAsync();