Внутреннее кэширование EF Core и многие типы DbContext во время тестирования.C#

Место общения программистов C#
Ответить
Anonymous
 Внутреннее кэширование EF Core и многие типы DbContext во время тестирования.

Сообщение Anonymous »

У меня много тестовых классов, в каждом из которых десятки тестов. Я хочу изолировать тесты, поэтому вместо мегаконтекста MyDbContext я использую MyDbContextToTestFoo, MyDbContextToTestBar, MyDbContextToTestBaz и т. д. Поэтому у меня МНОГИЕ подклассы DbContext .
В модульных тестах с EF Core 5 я столкнулся с сообщением ManyServiceProvidersCreatedWarning. Они работают индивидуально, но многие из них терпят неудачу при запуске в группе:

System.InvalidOperationException: возникла ошибка для предупреждения «Microsoft.EntityFrameworkCore.Infrastructure.ManyServiceProvidersCreatedWarning». : Более двадцати экземпляров IServiceProvider было создано для внутреннего использования Entity Framework. Обычно это происходит из-за внедрения нового экземпляра одноэлементной службы в каждый экземпляр DbContext. Например, вызов UseLoggerFactory каждый раз передает новый экземпляр — дополнительные сведения см. на https://go.microsoft.com/fwlink/?linkid=869049. Это может привести к проблемам с производительностью. Рассмотрите возможность просмотра вызовов DbContextOptionsBuilder, которые могут потребовать создания новых поставщиков услуг. Это исключение можно подавить или зарегистрировать, передав идентификатор события CoreEventId.ManyServiceProvidersCreatedWarning методу ConfigurationWarnings в DbContext.OnConfiguring или AddDbContext.

Я не делаю ничего странного с DbContextOptionsBuilder, как следует из этой ошибки. Я не знаю, как диагностировать «... это может потребовать создания новых поставщиков услуг». В большинстве тестов я обычно создаю контекст: new DbContextOptionsBuilder().UseSqlite("DataSource=:memory:"), где TContext — один из типов контекста, упомянутых выше.
Я прочитал много вопросов по репозиторию и обнаружил, что EF выполняет интенсивное кэширование самых разных вещей, но документации по этой теме не существует. Рекомендуется «найти причину кэширования такого большого количества поставщиков услуг», но я не знаю, что искать.
Есть два обходных пути:
  • Код: Выделить всё

    builder.EnableServiceProviderCaching(false)
    что, очевидно, очень плохо влияет на производительность.
  • Код: Выделить всё

    builder.ConfigureWarnings(x => x.Ignore(CoreEventId.ManyServiceProvidersCreatedWarning))
    , который игнорирует проблему.
Я предполагаю, что «поставщик услуг» означает внутренний IoC-контейнер EF.
Что я хочу знать: влияет ли тот факт, что у меня много типов DbContext (и, следовательно, типов IModel), на кеширование поставщика услуг? Связаны ли эти двое? (Я знаю, что EF кэширует IModel для каждого DbContext, кэширует ли он также поставщика услуг для каждого из них?)


Подробнее здесь: https://stackoverflow.com/questions/705 ... ng-testing
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»