SqlDependency с OutputCache

Я добавил кэш для некоторых из моих действий контроллера в приложении ASP.NET MVC 5, например:

[OutputCache(Duration = 900)]
public async Task<JsonResult> GetTechnologyCriteria()
{
    return Json(await _logic.GetTechnologyCriteria(), JsonRequestBehavior.AllowGet);
}

Работает отлично. Теперь я хочу сделать кеш недействительным, если таблица, которая передает этот вызов, изменится. Этот логический вызов выполняет несколько шансов и заканчивается, а затем вызывает слой _data, который содержит вызов EntityFramework, который попадает в базу данных. Я знаю, что могу добавить "Зависимость" к атрибуту метода, например так:

[OutputCache(Duration = 900, SqlDependency = "MySqlDependency")]

... и что-то вроде этого в файле web.config:

<caching>
  <sqlCacheDependency enabled="true" pollTime="1000" >
    <databases>
      <add name="MySqlDependency" connectionStringName="MyConnectionString" pollTime="1000" />
    </databases>
  </sqlCacheDependency>
</caching>

... но как ASP.NET узнает, на какую таблицу посмотреть зависимость? Я не хочу, чтобы ВСЕ изменения таблицы приводили к недействительности кэша этого метода, только одна таблица, которая его кормит.

Вот логический вызов:

public async Task<List<SearchCriterion>> GetTechnologyCriteria()
{
    return await _data.GetTechnologyCriteria().Distinct().OrderBy(c => c.Name).ToListAsync().ConfigureAwait(false);
}

... и вызов уровня данных:

public IQueryable<SearchCriterion> GetTechnologyCriteria()
{
    return
        from t in _db.Technologies
        from e in t.Employees
        where !e.Deleted
        select new SearchCriterion { Id = t.TechnologyId, Name = t.Name, Selected = false, Filtered = true };
}

Еще одна вещь. Когда я добавляю параметр SqlDependency в атрибут, он вызывает загрузку данных при каждом вызове (с указанием или без указания имени таблицы). Кэширование работает правильно без этого параметра (только с продолжительностью).

ОБНОВИТЬ:

Просто запустил следующее из командной строки. Хотя это и могло привести к возникновению SQLDependency, но, похоже, это не имело значения. Точка останова в методе, который запрашивает таблицу Technology, по-прежнему используется при каждом вызове.

aspnet_regsql.exe -S 33692-7480 -E -ed -d ProfileBuilderDevDatabase -et -t Technology

0 ответов

Другие вопросы по тегам