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 для C#», «Генератор DbContext EF 4.x для C#» и «Генератор DbContext EF 5.x для C#».

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

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

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

46
задан Ladislav Mrnka 11 April 2012 в 09:53
поделиться