Проблемы с использованием инструментов EF из-за попытки приложения получить доступ к базе данных - PullRequest
1 голос
/ 17 мая 2019

У меня есть приложение ASP.NET Core 2.2, использующее EF Core 2.2.

У меня есть несколько фоновых рабочих потоков, которые я запускаю в ConfigureServices(). Эти потоки зависят от DbContext и других сервисов, которые я регистрирую в ConfigureServices().

Я обнаружил, что когда я пытаюсь использовать Add-Migration, инструменты EF запускают эти потоки, которые, в свою очередь, генерируют исключения в выводе Add-Migration, поскольку потоки пытаются получить доступ к объекту базы данных, который еще не существует.

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

Некоторые варианты, которые я вижу, чтобы избежать этого: -

a) Каким-то образом в ConfigureServices() обнаруживается, что база данных не соответствует / не соответствует контексту (т. Е. Является "актуальной"), и действуйте соответствующим образом.

b) Запустите мои рабочие потоки где-нибудь еще, которые не будут вызываться, когда мое приложение запускается инструментами EF. Помните, что для запуска этих потоков требуется ServiceProvider с той же областью, которую я строю в ConfigureServices().

в) Обнаружить в моем приложении, что меня вызывают инструменты EF, и избегать запуска рабочих потоков.

Буду признателен за любые советы относительно наиболее подходящей стратегии и наилучшего метода ее достижения.

1 Ответ

1 голос
/ 17 мая 2019

Инструменты EF Core используют разные стратегии для создания производных DbContext, объясненные в разделе Создание DbContext во время разработки документации.

Похоже, что в настоящее время вы используете Из прикладных услуг .Но в соответствии с объяснением проблемы, наиболее подходящим в вашем случае представляется с фабрики времени разработки :

Вы также можете рассказать инструментам, как создать ваш DbContext с помощьюреализация интерфейса IDesignTimeDbContextFactory<TContext>: если класс, реализующий этот интерфейс, найден либо в том же проекте, что и производный DbContext, либо в проекте запуска приложения, инструменты обходят другие способы создания DbContext и используют фабрику времени разработкивместо.

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