Как устроено ядро ​​Entity Framework с внедрением зависимостей? - PullRequest
3 голосов
/ 28 сентября 2019

В Entity Framework Core вы обычно используете что-то подобное, что должно работать практически во всех случаях:

using (var dbContext = new MyDbContext()) {
    await dbContext.Entities.WhereAsync(e => e.Something == somethingElse);
    await dbContext.SaveChangesAsync();
}

Вы также можете использовать Dependency Injection с контекстом базы данных.Теперь вы бы добавили контекст базы данных в контейнер DI и внедрили его в классы / контроллеры / конструкторы / методы там, где вам это нужно:экземпляр как локальная переменная, что достаточно справедливо, но больше нет возможности использовать операторы using.Теперь два разных метода могут в конечном итоге использовать один и тот же dbContext одновременно, что, скорее всего, вызовет проблемы параллелизма.

Если dbContext не был введен, а просто использован в операторе using, тогда проблем быть не должнос параллелизмом, и объект будет расположен в конце каждого метода.

Итак, как бы вы правильно обрабатывали параллелизм и удаление с помощью Entity Framework Core и Dependency Injection?

1 Ответ

0 голосов
/ 28 сентября 2019

По умолчанию методы расширения AddDbContext do:

services.AddScoped<MyDbContext>()

Так что в случае AddDbContext новый экземпляр будет создан для каждого запроса и будет удален после выполнения работы (объектыодинаковы в запросе, но различны в разных запросах).Таким образом, у вас не должно быть проблем с параллелизмом.

Также вы можете добавить контекст для DI как переходный, если вам нужен новый экземпляр для каждого контроллера и каждой службы.

...