Массовая вставка с использованием EntityFramework Extended
В соответствии с этим массовая вставка в Entity может быть выполнена с использованием следующего кода:
var customers = GetCustomers();
db.Customers.AddRange(customers);
db.SaveChanges();
Я использовал SQL Profiler, чтобы проверить, сколько запросов на вставку было выполнено, и увидел, что для каждого элемента списка была вставка.
Зачем?
2 ответа
AddRange
Добавить диапазон не выполняет BulkInsert, он просто обнаруживает изменения один раз после добавления всех объектов в набор.
Метод DetectChange может быть ОЧЕНЬ медленным.
См.: Entity Framework - Производительность DetectChanges
Как вы заметили, он сохраняет сущности один за другим в базе данных, что НЕМЕДЛЕННО медленно.
EF.Extended
Эта библиотека больше не поддерживается, и нет функции массовой вставки.
Массовая вставка библиотеки
Существует три основных библиотеки, поддерживающие Bulk Insert:
- Расширения Entity Framework (платные, но поддерживаются)
- https://www.nuget.org/packages/EntityFramework.BulkInsert-ef6/ (больше не поддерживается)
- EFUtilities (больше не поддерживается)
Будьте осторожны, обе бесплатные библиотеки не поддерживают все наследования и ассоциации.
Отказ от ответственности: я владелец проекта http://entityframework-extensions.net/
Помимо Bulk Insert, эта библиотека позволяет выполнять все массовые операции:
- BulkSaveChanges
- BulkInsert
- BulkUpdate
- BulkDelete
- BulkMerge
- BulkSynchronize
Пример:
// Easy to use
context.BulkSaveChanges();
// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);
// Perform Bulk Operations
context.BulkDelete(customers);
context.BulkInsert(customers);
context.BulkUpdate(customers);
// Customize Primary Key
context.BulkMerge(customers, operation => {
operation.ColumnPrimaryKeyExpression =
customer => customer.Code;
});
Вот как EF6 выполняет "массовую" вставку, но не массовую, а построчную. В результате производительность отстой.
Вместо этого используйте EF.BulkInsert или EFUtilities.
Обновить:
DbSet<T>.AddRange()
является частью встроенного API, поэтому вы не используете EF.Extended или любую другую стороннюю библиотеку.