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