Entity Framework 4 и кеширование результатов запроса - PullRequest
25 голосов
/ 21 июня 2011

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

Ответы [ 3 ]

21 голосов
/ 21 июня 2011

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

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

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

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

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

12 голосов
/ 21 июня 2011

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

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

1 голос
/ 21 июня 2011

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

если вы собираетесь делать запросы по id, вы можете использовать метод ObjectContext.GetObjectByKey , и он будет искать в кеше объектов, прежде чем запрашивать базу данных.

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