Подтвердить что ты не робот

DbContext очень медленно при добавлении и удалении

При использовании DbContext в первом сценарии базы данных я обнаружил, что добавление и удаление объектов происходит очень медленно по сравнению с ObjectContext. Если добавить 2000 объектов и сохранить изменения в конце, DbContext в 3 - 5 раз медленнее ObjectContext (кстати, я знаю, что добавление большого количества объектов было бы лучше с использованием SqlBulkCopy, но это не так). Если сохранение изменений после каждого добавления DbContext по-прежнему почти в два раза медленнее. Когда дело доходит до удаления, это даже ухудшается: при сохранении в конце всех абзацев сущности DbContext примерно в 18 раз медленнее ObjectContext.

Я использовал свое высокоразвитое тестовое приложение, которое я использую для сравнения технологий доступа к базам данных и небольшого консольного приложения для двойной проверки. Оба показали плохие результаты для добавления и удаления объектов с использованием DbContext. Ниже приведены результаты консольного приложения:

Inserting 2000 entities via DbContext saving changes at the end: 2164ms
Inserting 2000 entities via ObjectContext saving changes at the end: 457ms
Inserting 2000 entities via DbContext saving changes after each object addition: 8420ms
Inserting 2000 entities via ObjectContext saving changes after each object adding: 4857ms
Inserting 2000 entities via DbContext using a new DbContext for each object addition: 4018ms
Deleting 2000 entities via DbContext saving changes at the end: 4794ms
Deleting 2000 entities via ObjectContext saving changes at the end: 261ms
Deleting 2000 entities via DbContext saving changes after each object deletion: 25536ms
Deleting 2000 entities via ObjectContext saving changes after each object deletion: 2110ms

Я попытался использовать EF 4.3 в VC 2010 и EF 5.0 Beta 2 в VS 11 с почти такими же результатами. Я использовал шаблоны T4, предоставленные "EF 4.x POCO Entity Generator для С#", "EF 4.x DbContext Generator для С#" и "EF 5.x DbContext Generator для С#".

Что может быть неправильным? Согласно результатам теста, я никогда не использовал бы DbContext в приложении, которое должно добавлять или удалять объекты (что делает DbContext непригодным для использования для меня).

Я помещал тестовые приложения консоли на свой веб-сервер: EF 4.3 DbContext Test, EF 5.0 DbContext Test

Любые идеи/исправления приветствуются.

4b9b3361

Ответ 1

Попробуйте добавить это в свои тесты DbContext:

dbContext.Configuration.AutoDetectChangesEnabled = false;

// Now do all your changes

dbContext.ChangeTracker.DetectChanges();
dbContext.SaveChanges();

и попробуйте снова запустить тесты.

В DbContext API было внесено некоторое архитектурное изменение, которое проверяет изменения в объектах каждый раз, когда вы Add, Attach или Delete что-либо из контекста. В ObjectContext API это обнаружение выполняется только при срабатывании SaveChanges. Это лучшее решение для большинства распространенных сценариев, но для этого требуется специальная обработка для массовой обработки данных.

Ответ 2

В EF6 теперь вы можете использовать AddRange и RemoveRange на DbSet.

От документации к ссылкам:

Обратите внимание, что если для параметра AutoDetectChangesEnabled установлено значение true (это значение по умолчанию), то DetectChanges вызывается один раз перед {добавлением, удалением} любых объектов и не будет вызываться снова. Это означает, что в некоторых ситуациях {Add, Remove} Range может выполнять значительно лучше, чем вызов {Add, Remove} несколько раз.