MVC 5 Проблема внедрения зависимостей DBContext - PullRequest
0 голосов
/ 12 февраля 2020

Я использую MVC5 с EF Core 2.2 и DI. У меня есть настройка DbContext как Scoped, но, похоже, он действует как синглтон.

Запрос 1: Создает область транзакции. Создает новый объект1 в DbContext и добавляет его, Создает новый объект2, добавляет его, но завершается неудачно, и откат транзакции.

Запрос 2: Создает область транзакции. Создает новый объект1 в DbContext, но завершается неудачей, поскольку он уже отслеживает изменения из запроса 1. Его нет в БД. Перезапуск веб-приложения позволяет выполнить первый запрос через go снова (поскольку трекер очищен)

Я не представляю, как он все еще отслеживает этот объект, если второй запрос должен был иметь совершенно новый контекст, и ничего в отслеживании Если я не использую DI и просто создаю экземпляр контекста в контроллере, он работает.

Ошибка: экземпляр типа сущности не может быть отслежен, так как другой экземпляр этого типа с тем же ключом уже отслеживаемый

services.AddDbContext<ApplicationDbContext>(options =>
{
            options.UseSqlServer(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString, builder =>
            {
                builder.UseRowNumberForPaging();
            });
}, ServiceLifetime.Scoped);

services.AddScoped(typeof(ChairManager));

ChairController с DI класса менеджера

public ChairController(ChairManager chairManager, IServiceProvider services)...

ChairManager класс с DI контекста

public ChairManager(ApplicationDbContext context)...

ChairController вызывает метод ChairManager

await _chairManager.AddChairAsync(chair)

Теперь, если я сделаю что-то подобное и не буду использовать DI. Никаких проблем ...

public ChairController(IServiceProvider services)
{
        var context = ApplicationDbContext.Create();
        _chairManager = new ChairManager2(context);
}

...

await _chairManager.AddChairAsync(chair)

1 Ответ

0 голосов
/ 12 февраля 2020

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

Для основных контроллеров я использовал this . Ключом здесь был класс «ServiceScopeModule». Это позволило обработать выделенные ресурсы.

Для контроллеров Web API я реализовал ответ из здесь . В частности, класс «MsDiHttpControllerActivator».

Теперь я получаю правильно заданный DbContext в MVC 5, который удаляется после запроса на завершение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...