EFCore DbContext быстрее, если я использую много из них вместо одного? Почему? - PullRequest
0 голосов
/ 19 апреля 2020

Контекст:

Я выполняю миграцию с Access на SQL Сервер. Это сложная миграция sh, которая выполняется довольно часто, поэтому я интегрировал ее в веб-сайт, чтобы пользователь мог иногда делать это самостоятельно, если это необходимо.

Странность:

Поэтому я сначала решил go с одним контекстом, выполняющим обычные SaveChanges() в конце каждой области.

Когда дошло ~ 60 тыс. Вставок, для сохранения потребовалось ОЧЕНЬ много времени.

Хорошо, я думал, я просто буду запускать SaveChanges после каждой записи. Это заняло много времени. Непристойно долго.

Хорошо, поэтому я решил попробовать SaveChangesAsync и просто не мог заставить его работать. Я был готов выделить для этой области свою собственную Dbcontext и просто сохранить ее в фоновом режиме, и до финала я бы ее дождался. Не могу заставить это работать. Сначала он выдавал ошибку, а затем просто не сохранял данные.

Хорошо, поэтому следующим шагом было попытаться присвоить этому методу собственный DbContext. Работал как МЕЧТА.

Затем я дал каждому методу (всего около 13) свои DbContext. Все было очень быстро.

Итак, мой вопрос: в чем разница между одним DbContext с 13 SaveChanges() вызовами и 13 DbContexts с 13 вызовами на SaveChanges()?

После запуска SaveChanges() осталось что-то, что я мог почистить? Или я должен просто go со многими DbContext? Я просто пытался не открывать новое соединение каждый раз, чтобы сэкономить немного времени, но это не так уж и сложно, но мне все еще не хватает понимания , почему это так. Может ли кто-нибудь научить меня?

1 Ответ

3 голосов
/ 19 апреля 2020

Что-то осталось после того, как вы запустили SaveChanges (), что я мог почистить?

Да. Отслеживание изменений. По умолчанию DbContext сохранит все загруженные сущности, и в этом сценарии загрузка дополнительных сущностей и идентификация измененных сущностей все более возрастают.

Поэтому используйте несколько экземпляров DbContext или отсоедините все сущности после SaveChanges (), как в ответе здесь Как очистить отслеживаемые сущности в каркасе сущностей ;

...