Entity Framework 4 возвращается к базе данных при выполнении одного и того же запроса дважды - PullRequest
2 голосов
/ 05 июля 2011

Я всегда предполагал, что EF кэширует результаты запроса и что он просто возвращает список сущностей из своего внутреннего кэша, вместо того, чтобы выполнить один и тот же запрос дважды в базе данных.

var cipEntities = new CIPEntities(); // instantiate objectcontext
Console.WriteLine(cipEntities.Customers.ToList()); // fires db query
Console.WriteLine(cipEntities.Customers.ToList()); // also fires db query

Есть ли у меняневерное предположение?Может быть, меня смущает мой опыт работы со службами RIA, может, службы RIA кэшируют результаты, а EF - нет?

Спасибо

Ответы [ 4 ]

3 голосов
/ 05 июля 2011

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

Если вы хотите настроить кэширование, вы можете проверить: Отслеживание и кэшированиеПоставщики

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

2 голосов
/ 05 июля 2011

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

Решением является поставщик кэширования, упомянутый @ Robotsushi.

1 голос
/ 05 июля 2011

Это стандартное поведение с EF, простой способ обойти это - кешировать ваши результаты в локальную переменную и использовать вместо этого:

var results = cipEntities.Customers.ToList();
Console.WriteLine(results);
Console.WriteLine(results);
0 голосов
/ 05 июля 2011

Если вы не решите преобразовать его в предварительно перечислимый класс (т.е. .ToList()), тогда EF будет выполнять запрос каждый раз, когда вы пытаетесь перечислить. Фактически, если вы используете сложный класс в качестве результата хранимой процедуры, если вы не приведете его с использованием перечислимой коллекции, он выдаст ошибку.

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