Есть ли разница между использованием DbContext по умолчанию против SpecificDbContext в качестве служебной зависимости? - PullRequest
0 голосов
/ 08 октября 2019

Мы используем несколько микро-сервисных приложений, каждое со своим специфическим DbContext. Немногие сущности дублируются во всех этих контекстах по необходимости, например - сущность Region. Я хочу использовать один сервис для выполнения CRUD в регионах в всех контекстах БД . Вот почему я использовал значение по умолчанию DbContext в качестве зависимости в этом сервисе, полагаясь на контейнер IoC в каждом приложении микросервиса, чтобы предоставить свои специфичные , назовем его ExampleDbContext. Затем я использую Set<Region> для манипулирования сущностью.

Я получаю противоречивое поведение - иногда оно работает, в то время как большую часть времени я получаю:

InvalidOperationException: была сделана попытка использовать контекст во время его настройки. Экземпляр DbContext нельзя использовать внутри OnConfiguring, поскольку он все еще настраивается на этом этапе. Это может произойти, если вторая операция запускается в этом контексте до завершения предыдущей операции ...

Из того, что я могу понять, виновником по умолчанию является одновременное использование одного и того же экземпляра DbContext. Все наши методы async, поэтому это, безусловно, возможно, но я нахожу это маловероятным, поскольку вызываемый код вызывается один раз при запуске приложения внутри метода Program.Main. В любом случае, я не уверен, как это подтвердить или исключить.

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

В качестве дальнейшего примечания я думаю, что экземпляр ExampleDbContext создается 3 раза, потому что точка останова внутри него OnConfiguringМетод получает удар 3 раза.

Редактировать

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

Редактировать 2

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

Одна часть все еще отсутствует в загадке: - Почему использование DbContext вместо ExampleDbContext бросало чаще?

В целом, я полагаю, что мораль этой истории такова: "Не торописьустранить очевидную причину проблемы ". Когда это не обсуждается, подумайте о других причинах и только потом сообщайте о просьбе о помощи.

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