ModelBuilder является потокобезопасным? - PullRequest
0 голосов
/ 03 апреля 2019

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

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

Фон

Чтобы ускорить запуск,Времени для приложения я хотел сделать 2 запроса параллельно, используя 2 различных DbContexts.По сути, каждый из них отражает «базу данных с ограниченным контекстом» в моем домене, одно сопоставление с настройками среды (пользовательские настройки, сохраненные макеты пользовательского интерфейса, ...) в базе данных и одно сопоставление с настройками системы (системные пароли, ...).

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

Проблема

Обе задачи сами создают базовый DbContext, поэтому DbContext создается в этом потоке.Но почему-то кажется, что фактическое построение модели под капотом EF Core выполняется по-разному или не "для" потока или "для DbContext".

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

System.InvalidOperationException: Cannot create a DbSet for 'EvaluationSettings' because this type is not included in the model for the context.

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

  • Поток 18 предназначен для системных компонентов.и регистрирует SystemInformation и Variable в своем контексте и вызывает «EnsureCreated»
  • Thread 16 для получения настроек культуры и т. д., а также регистрирует Evaluation, EvaluationSettings, ... в контексте и вызывает «EnsureCreated»

Впоследствии поток 16 (получение системной культуры из сущности EvaluationSettings) завершается неудачей.

image

Когда я отлаживаю эту проблему и пытаюсь получить представление о модели-Я вижу, что построителю модели DbContext известен только тип Evaluation.Остальное как-то пропало.

image

Вопрос

Может ли быть так, что, поскольку 3 потока вызывают "EnsureCreated" параллельно, только эти объекты получают модельв контексте, которые были зарегистрированы в тот момент?Кажется, что на этом уровне нет изоляции «эта модель принадлежит этому контексту», верно?

У кого-нибудь есть возможное решение для этого?Или предложение, как это решить?

Версия

EF Core 2.2.1

GitHub Issue

https://github.com/aspnet/EntityFrameworkCore/issues/15243

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