Как я могу эффективно удалить все записи в таблице с помощью Entity Framework без использования SQL? - PullRequest
0 голосов
/ 14 июля 2020

Мне нужно удалить все записи в данной таблице, используя DbContext в Entity Framework. Мне нужно, чтобы это было переносимым, чтобы он не мог полагаться на операторы SQL или хранимые процедуры. Я просмотрел ответы на этот вопрос , но ни один из них не соответствует моим требованиям и не является идеальным решением по разным причинам.

Я мог бы использовать метод RemoveRange, т.е.

DbContext.Table.RemoveRange(all);

Но это плохо масштабируется, потому что он выбирает все записи перед удалением, что может занять много времени с Entity Framework. Итерация по каждой записи и удаление их по отдельности с помощью команды Remove (запись) имеет ту же проблему.

Используя SQL, это просто, используя команду TRUNCATE. Даже простая команда DELETE FROM [TableName] работает, но я не знаю, насколько она масштабируема.

Есть ли какое-либо решение, использующее только Entity Framework (без SQL) и не требующее выбора все записи перед их удалением?

Ответы [ 2 ]

1 голос
/ 14 июля 2020

В настоящее время это невозможно с использованием Entity Framework. см. https://github.com/dotnet/efcore/issues/795

Возможно, существует расширение, которое позволит вам это сделать, но я не уверен, что оно будет работать со всеми системами СУБД.

0 голосов
/ 14 июля 2020

Предположим, у вас есть таблица 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; }

    }

Наконец, это метод, который удаляет бренд по его идентификатору:

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

Изменения будут сделаны после запуска метода SaveChangesAsyn c ().

UPDATE

Для удаления всех записей :

    var brands = await _dbContext.BrandData.ToListAsync();
    
                    foreach(var brand in brands)
                    {
                        _dbContext.BrandData.Remove(brand);
                    }

    await _dbContext.SaveChangesAsync();
...