Кэшированная таблица с каркасом сущностей

entity-framework caching

2255 просмотра

2 ответа

3999 Репутация автора

У меня есть некоторые таблицы данных, которые почти никогда не меняются, поэтому я не хочу вызывать базу данных каждый раз, когда запускаю запрос в db-context. В NHibernate есть возможность сделать это на маппере: Cache.ReadOnly ();

И он будет читать всю таблицу в ваш кеш при запуске, и каждый раз, когда вы захотите загрузить объект, как при ленивой загрузке, он будет извлекать данные из кэшированной памяти.

Как я могу сделать то же самое с Entity-Framework?

Автор: Ashkan Sirous Источник Размещён: 18.07.2016 08:54

Ответы (2)


1 плюс

5631 Репутация автора

Вы можете попробовать Entity Framework Extended Library для ваших целей. С помощью этой библиотеки вы можете написать что-то вроде этого

  //query is cached using the default settings
  var c = db.Countries.Where(t => t.IsActive).FromCache();

Это не совсем то, что вы хотите, но если вы используете Repositoryшаблон, вы можете инкапсулировать эту логику.

Другой подход: если вы хотите использовать только встроенные средства, вы можете использовать свойство Local .

Пример:

db.Countries.Load(); // load to cache
var countriesFromEFCache = db.Countries.Local;

foreach (var county in countriesFromEFCache ) // There is not any db query here
{
  ...
}
Автор: Ilya Размещён: 18.07.2016 10:32

1 плюс

4551 Репутация автора

Решение

Использование .Single, .First, .Whereetc не будет кэшировать результаты, если вы не используете кэширование второго уровня.

Если вам нужно кэшировать результат, вам нужно реализовать кэширование второго уровня в EF.

EntityFramework.Cache, который позволяет нам кэшировать результаты запросов для приложений EF 6.1.

нам нужно указать EF использовать кэширование путем настройки поставщика кэширования и обработчика транзакций.

public class Configuration : DbConfiguration
{
    public Configuration()
    {
        var transactionHandler = new CacheTransactionHandler(new InMemoryCache());
        AddInterceptor(transactionHandler);
        var cachingPolicy = new CachingPolicy();
        Loaded +=(sender, args) => args.ReplaceService<DbProviderServices>(
            (s, _) => new CachingProviderServices(s, transactionHandler,
            cachingPolicy));
    }

}
Автор: Eldho Размещён: 18.07.2016 12:36
Вопросы из категории :
32x32