Мы используем несколько микро-сервисных приложений, каждое со своим специфическим 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
бросало чаще?
В целом, я полагаю, что мораль этой истории такова: "Не торописьустранить очевидную причину проблемы ". Когда это не обсуждается, подумайте о других причинах и только потом сообщайте о просьбе о помощи.