Как: EF Core свойство SetValueConverter, но его работа зависит от HttpContext - PullRequest
0 голосов
/ 23 мая 2019

Моя модель DbContext имеет ValueConverters,

protected override void OnModelCreating(ModelBuilder builder)
{
  foreach (var entityType in builder.Model.GetEntityTypes())
  {
     foreach (var property in entityType.GetProperties())
     {
        // and somewhere deep:
           property.SetValueConverter(myConverter);

Логика преобразования зависит от сеанса, поэтому мне необходимо получить доступ к HttpContext в процессе преобразования. Не проблема (я думал, что это наивно), класс MyConverter внедрит IHttpContextAccessor.

Тогда я понял, что для всех созданных dbcontexts будет выполняться только один раз OnModelCreating, потому что созданная модель кэшируется. Таким образом, фактически того же MyConverter, и именно поэтому один и тот же экземпляр IHttpContextAccessor будет называться всеми моими последующими преобразованиями, не имеет значения, как я его настраиваю (Singleton, Scoped или Transient) метод доступа One, который принадлежит Одна модель.

Вопрос

Я читал, что «хранилище резервных копий HttpContextAccessor является асинхронным локальным», но мне не ясно, можно ли использовать этот HttpContextAccessor, который вводится в какой-то самый первый запрос (когда модель создается сначала, один раз) в 100 дней спустя в другом запросе ...

PS: мне удалось заставить не кэшировать модель путем реализации IModelCacheKeyFactory, но, кроме того, что это очень уродливый хак, создание модели было слишком медленным каждый раз (более чем в 100 раз медленнее), я немедленно отбросил этот обходной путь

...