Как получить доступ к DBContext, используемому в EntityManager?

1

Я вставляю/обновляю большое количество сущностей (~ 5000) во время процесса, и это занимает огромное количество времени (это таймаут на транзакции 5 минут).

Я прочитал, что по умолчанию DBContext.AutoDetectChangesEnabled установлен в ON и вызывает такое поведение (http://www.exsertus.be/2014/10/ef-bulk-performance/).

Насколько я понимаю, Devforce "вроде" инкапсулирует DBC-текст внутри каждого EntityManager. Devforce использовать его собственную реализацию, если я не определяю мой, который я сделал. Я хотел бы знать, как я могу получить к нему доступ, чтобы иметь возможность "играть" с этим свойством AutoDetectChangesEnabled.

Или есть ли другое решение для вставки/обновления/удаления большого количества объектов с помощью Devforce?

С уважением

Теги:
performance
entity-framework
devforce

2 ответа

0
Лучший ответ

Поскольку вы определили свой собственный DbContext, вы можете изменить этот параметр свойства в конструкторе DbContext с Configuration.AutoDetectChangesEnabled = false;

Однако я не уверен, насколько это поможет. Если ваше приложение является n-тиром, и вы пытаетесь сохранить ~ 5000 сущностей по проводу, это всегда будет медленным, и вы также столкнетесь с таймаутами связи. Как правило, если вам нужно делать массовые операции, DevForce - это не оптимальный подход.

  • 0
    Привет ким Каков наилучший подход, учитывая, что все приложение / модель основана на devforce? Также я заметил, что когда я вызываю SavesChanges (), я могу подождать более 1 минуты, чтобы увидеть первый заказ SQL, отправляемый на сервер SQL, почему генерация SQL занимает так много времени. Я понятия не имею, кто его генерирует, Devforce или EF ...
  • 0
    EF генерирует SQL, но может происходить гораздо больше, чем просто генерация SQL, делающая его медленным. Хотя у меня нет никакого опыта с ними, если массовые операции не являются частью вашего основного приложения, я бы посмотрел на использование утилит EF. Если вы хотите, чтобы кто-то из IdeaBlade взглянул на это дальше, откройте заявку в службу технической поддержки через форму веб-поддержки.
1

Я работал с этим инструментом EF " https://www.nuget.org/packages/EFUtilities ", и я получил большое повышение производительности с большими вставками, поскольку он использует массовую копию вместо обычной вставки на объект.

Вы можете проверить документацию Github здесь.

Я использовал его с транзакцией в 17 000 объектов и завершил его через несколько секунд. Проверьте это, чтобы лучше понять и сравнить с EF. http://blog.credera.com/technology-insights/microsoft-solutions/entity-framework-batch-operations-using-ef-utilities/

Образец использования утилиты для вставки списка объектов выглядит следующим образом:

using (var db = new YourDbContext())
{
    EFBatchOperation.For(db, db.BlogPosts).InsertAll(list);
}

Надеюсь это поможет.

  • 0
    к сожалению, я не могу использовать это, поскольку мне нужно исправить первичный ключ
  • 0
    Вы имеете в виду, что вы генерируете свои идентификаторы? Если это так, то это нормально, потому что инструмент работает с вашими сущностями, но вместо того, чтобы прикреплять их к контексту и сохранять их по одному, этот инструмент будет толкать их всех за один раз. В библиотеке определенно стоит попробовать.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню