Подтвердить что ты не робот

Entity Framework 4 и кэширование результатов запроса

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

4b9b3361

Ответ 1

Контекст EF будет кэшировать "на один экземпляр". То есть каждый экземпляр DbContext хранит его собственный независимый кеш объектов. Вы можете сохранить результирующий список объектов в статическом списке и запросить все, что вам нравится, не возвращаясь в базу данных. Чтобы быть в безопасности, убедитесь, что вы оставите DbContext после выполнения запроса.

var dbContext = new YourDbContext();
StaticData.CachedListOfThings = dbContext.ListOfThings.ToList();

Вы можете позже использовать LINQ для запроса статического списка.

var widgets = StaticData.CachedListOfThing.Where(thing => thing.Widget == "Foo");

Запрос выполняет сбор в памяти, а не базу данных.

Ответ 2

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

Кэширование для каждого экземпляра контекста действительно работает, но использование самого контекста как кеша - довольно плохой выбор - в большинстве сценариев я бы назвал его EF anti-pattern. Использовать контекст как единицу работы= не использовать контекст для нескольких логических операций.

Ответ 3

вам придется сворачивать свои собственные для любых запросов ef4 linq, так как они всегда разрешены к sql и, таким образом, всегда будут попадать в db. простой кеш для ваших парных таблиц, вероятно, не составит труда написать.

если вы собираетесь запросить идентификатор, вы можете использовать метод ObjectContext.GetObjectByKey, и он будет выглядеть в объекте кеш перед запросом db.