Массовая вставка с использованием 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:

Будьте осторожны, обе бесплатные библиотеки не поддерживают все наследования и ассоциации.


Отказ от ответственности: я владелец проекта 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 или любую другую стороннюю библиотеку.

Другие вопросы по тегам