Кэшировать данные Entity Framework и отслеживать их изменения? - PullRequest
5 голосов
/ 07 марта 2012

То, что я хочу, концептуально довольно просто, но я не могу понять, как было бы лучше реализовать такую ​​вещь.

В моем веб-приложении у меня есть сервисы, которые обращаются к репозиториям, которые обращаются к EF, который взаимодействует сбаза данных SQL Server.Все они создаются один раз за веб-запрос.

Я хочу иметь дополнительный слой между репозиториями и EF (или сервисами и репозиториями?), Который статически отслеживает объекты, которые извлекаются и передаются вбаза данных.

Цель, предполагая, что доступ к БД осуществляется только через приложение, заключается в том, чтобы мы знали о том факте, что если какой-либо репозиторий не получит доступ к EF и не внесет изменение, объект будет установленна самом деле не изменилось.

Примером может быть:

Репозиторий вызывает метод GetAllCarrots();

GetAllCarrots()выполняет запрос на SQL Server, получая List<Carrot>, если между ними ничего не происходит, я бы хотел, чтобы этот запрос фактически никогда не выполнялся на SQL Server каждый раз (независимо от того, находится ли он на другом веб-запросе, я хочубыть в состоянии справиться с этим сценарием)

Теперь, если вызов BuyCarrot() добавляет Carrot к таблице, то я хочу, чтобы это сделало недействительным статический кеш для Carrot s, чтоh заставит GetAllCarrots(); потребовать повторного запроса к базе данных.

Какие есть хорошие ресурсы для кэширования базы данных?

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Для этого можно использовать LinqToCache .

Это позволяет вам использовать следующий код в вашем хранилище:

var queryTags = from t in ctx.Tags select t;
var tags = queryTags.AsCached("Tags");
foreach (Tag t in tags)
{
  ...
}

Идея состоит в том, что вы используете SqlDependency , чтобы получать уведомления при изменении результата запроса. Пока результат не меняется, вы можете его кешировать.

LinqToCache отслеживает ваши запросы и возвращает кешированные данные при запросе. При получении уведомления от SqlServer кэш сбрасывается.

1 голос
/ 08 марта 2012

Я рекомендую вам прочитать http://rusanu.com/2010/08/04/sqldependency-based-caching-of-linq-queries/.

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

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

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