Быстрая вставка 4000+ записей в БД через Entity Framework
Быстрый ответ
Для массовой вставки данных рекомендуется использовать EFCore.BulkExtensions. Данный инструмент исключает механизм отслеживания изменений Entity Framework из процесса, что позволяет осуществлять прямую и высокоэффективную запись данных.
Пример:
context.BulkInsert(entitiesList); // Скорость звездолёта Enterprise! 🚀
Чтобы оптимально справиться с массовым внесением данных, рассмотрим методы, которые способствуют ускорению процесса.

Максимизация скорости
Группировка: Создание эффективных блоков из большого объема данных
Сформируйте группы записей и старайтесь избегать вызова SaveChanges()
после каждой из них. Концентрирование вызовов базы данных помогает увеличить скорость обработки данных.
foreach (var entity in entitiesList)
{
context.Add(entity); //Собираем набор сущностей!
}
context.SaveChanges(); //Производим запись данных!
Совет по пороговому значению: Экспериментируйте с размерами групп. Возможно, начните с размера около 100 и затем увеличьте его до 1000 или более, чтобы подобрать оптимальное значение.
Внимание, память: Большие объекты могут нагрузить вашу память. Определите безопасный предел и избегайте ошибок переполнения памяти.
Уменьшение нагрузки на отслеживание изменений
Отключите AutoDetectChangesEnabled
в Entity Framework для ускорения работы. Так вы отмените внутреннее отслеживание изменений, которое может замедлять выполнение массовых операций.
context.Configuration.AutoDetectChangesEnabled = false; // Выключаем автоотслеживание изменений для ускорения процесса.
Для сохранения высокой производительности регулярно обновляйте DbContext.
Управление транзакциями с вашей стороны!
Оберните операции в TransactionScope
. Этот подход обеспечивает согласованность и целостность данных, что крайне важно при взаимодействии с базой данных.
using(var transaction = new TransactionScope())
{
// Здесь реализуются все предварительно отложенные операции!
transaction.Complete(); // Завершаем транзакцию!
}
Асинхронность: ключ к эффективности!
Асинхронные методы, такие как BulkInsertAsync
, помогут увеличить пропускную способность и поддержать отзывчивость вашего приложения.
Применение SQLBulkCopy: Обходим EF
В случаях с большим объем данных можно обойти Entity Framework и использовать SqlBulkCopy
.
using (var bulkCopy = new SqlBulkCopy(connection))
{
//BulkCopy ожидает настройки
// После этого производит быстрое копирование данных из источника в целевое место
}
Дополнительную информацию о возможностях SqlBulkCopy
вы найдете в документации.
Настройка оптимизации
Отключите ValidateOnSaveEnabled
для ускорения сохранения. Это очень поможет при вставке большого объема данных. Все мы любим быстрое сохранение, не так ли?
Понимание компромиссов
Entity Framework – замечательное средство для стандартных операций CRUD, однако у каждого супергероя есть свои слабые места. Для крупных задач raw SQL может стать спасительным кругом.
Визуализация
Визуализируем, как различные подходы влияют на скорость вставки при работе с Entity Framework:
- Стандартный метод `Add()`:
🐌💤: [📝, 📝, 📝, ..., 📝] (Один за другим. Нехватка скорости...)
- Метод `AddRange()`:
🐎💨: [📝📝📝📝📝📝📝📝📝] (Ого, как быстро! Группировка делает свое дело!)
- Использование расширения `BulkInsert`:
🚀💫: [[[[📝📝📝📝...]]]] (Это скорость света!)
Готовьтесь к вставке данных со скоростью света, оставив позади традиционные методы!
Подготовка к возможным сложностям
Важно быть готовым к трудностям, даже когда все кажется идеальным.
Управление нагрузкой на базу данных и таймаутами
Следите за нагрузкой, которую вы создаете для вашей базы данных. При внесении больших объемов данных неизбежно возникают проблемы перегрузки сервера. Устраните проблемы с тайм-аутами, оптимизировав размер блоков.
Особенности EF
Entity Framework – мощная среда, но она не предназначена для любых задач. Знайте ограничения его применения и не забывайте про проверенный стандарт – raw SQL!
Конкуренция: Закон двух пицц
При высокой степени конкуренции используйте оптимистическое согласование, чтобы избежать блокировок и обеспечить непрерывное выполнение операций.
Поддержание высокой скорости с EF Core
Если вы не можете обойти EF, научитесь добиваться от него максимальной привлекательности с EF Core.
EFCore.BulkExtensions
способен помочь в быстрой вставке данных и при выполнении операций с upsert.- Обеспечьте плавное выполнение операций с
BulkInsertOrUpdateOrDelete
. Вот это понимают под работой с EF. - Если вы используете
SqlBulkCopy
в сочетании с EF, рассмотрите использование специального datareader для достижения наилучших результатов.
Полезные материалы
- EF Core Bulk Insert | Оптимизация вставки данных для EF6 и EF Core — параметры оптимизации процесса вставки данных с использованием Entity Framework.
- c# – Почему вставка сущностей в EF 4.1 так медленно, по сравнению с ObjectContext? – Stack Overflow — открытая дискуссия о свойствах EF при вставке данных.
- Data Points – Преимущества Code First в Entity Framework 6 | Microsoft Learn — рекомендации Microsoft о повышении производительности в EF.
- c# – Как можно ускорить DbSet.Add()? – Stack Overflow — Add vs AddRange: важное обсуждение для тех, кто хочет увеличить скорость работы с Entity Framework.
- Работа с хранимыми процедурами в Entity Framework Core — ничто так не проверено временем, как хранимые процедуры. Они особенно эффективны при массовой вставке данных в EF.