EF6: удаление сущностей происходит очень медленно с помощью RemoveRange - PullRequest
0 голосов
/ 30 октября 2019

Из прочтения многих других постов мне кажется, что мне нужно использовать

context.DbSet<Table>.RemoveRange(…);
context.SaveChanges(); 

для эффективного удаления нескольких сущностей.

К сожалению, в моем сценарии это все еще занимает слишком много времени,В тестах даже удаление 5 объектов с примерно 10 полями занимает около 1 секунды на объект. Это слишком медленно.

Кто-нибудь может предложить что-нибудь еще, что я могу сделать для улучшения производительности?

Заранее благодарен за любую помощь.

РЕДАКТИРОВАТЬ

Вот как выглядит метод, который работает:

  public void RemoveClassReportGroupings(IEnumerable<(int clientClassId, int classReportGroupingId)> enumerable)
        {
            List<Class_ReportGrouping> removeItems = new List<Class_ReportGrouping>();

            var dict = _context.ClassReportGroupings.Select(i => i).ToDictionary(i=> (i.ClassId, i.GroupingId));

            foreach (var item in enumerable)
            {
                var removeItem = dict[(item.clientClassId ,item.classReportGroupingId)];
                removeItems.Add(removeItem);
            }

            _context.ClassReportGroupings.RemoveRange(removeItems);

        }

1 Ответ

0 голосов
/ 30 октября 2019

Полагаю, это не имеет ничего общего с EF, но с оптимизацией базы данных.

SaveChanges - это место, где Entity Framework фактически компилирует ваш запрос LINQ в подходящий запрос SQL и выполняет его в базе данных.

Возможно, вы захотите получить созданный EF запроса для удаления для проверки вручную или просмотра возможных оптимизаций запросов с помощью такого инструмента, как MS SQL SQL Server Management Studio (SSMS)

Существует множество ресурсов по запросуанализ и оптимизация для сервера SQL, посмотрите вокруг них, например, от Microsoft (вышел в отставку, но все еще актуален)

...