Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不使用SQL的情况下使用实体框架高效地删除表中的所有记录?_C#_.net_Entity Framework_Entity Framework Core - Fatal编程技术网

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

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删除给定表中的所有记录。我需要它是可移植的,所以它不能依赖SQL语句或存储过程。我已经看过了的答案,但没有一个符合我的要求,或者是出于各种原因的理想解决方案

我可以使用Removatange方法,即

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();