2014-12-02 4 views
1

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

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

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

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

С уважением

ответ

0

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

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

+0

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

+0

EF генерирует SQL, но может быть намного больше, чем просто генерация SQL, что замедляет работу. Хотя у меня нет опыта с ними, если массовые операции не являются частью вашего основного приложения, я бы посмотрел на использование служебных программ EF.Если вы хотите, чтобы кто-то из IdeaBlade взглянул на это дальше, пожалуйста, откройте окно технической поддержки через форму поддержки в Интернете. –

1

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

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

Я использовал его с транзакцией в 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

к сожалению, я не могу использовать это, поскольку мне нужен первичный ключ fixup – kdev

+0

Вы имеете в виду, что вы генерируете свои идентификаторы? Если это так, то это прекрасно, потому что инструмент работает на ваших сущностях, но вместо того, чтобы привязывать их к контексту и сохранять их один за другим, этот инструмент будет толкать их всех за один раз. Библиотека, безусловно, стоит попробовать. –

+0

@kdev Я думаю, вы имеете в виду, что вы фактически вставляете в две таблицы и должны указывать дочерние строки родителям? Это сложная проблема, если вы используете идентификатор базы данных для родителя. (Я всегда переключаюсь на guid или аналогичный в этих ситуациях). –

Смежные вопросы