#sql #entity-framework #caching #entity-framework-5
#sql #entity-framework #кэширование #entity-framework-5
Вопрос:
У меня странная проблема, с которой я раньше не сталкивался. Я использую Entity Framework для извлечения своих записей.
У меня следующий вызов:
var dbOrganisation = repository.DbOrganisation.FirstOrDefault(c => c.Id == id);
Я не ожидаю кэширования этого вызова. Поэтому, когда я выполняю этот вызов, я ожидаю, что он запросит базу данных и получит последний DbOrganisation
объект. Но это не то, что происходит.
Я вызываю этот метод относительно два раза относительно короткое время после каждого другого (~ 5-10 секунд). Но в этот период десятичное значение в этой таблице может быть изменено какой-либо третьей стороной.
Однако, даже если значение изменяется, FirstOrDefault
вызов извлекает не обновленную версию.
Пример ситуации:
- Я выполняю
FirstOrDefault
вызов и вижу десятичное значение поляCredits
, равное 50 - Третья сторона изменяет значение
Credits
на 45 - Я делаю
FirstOrDefault
вызов через 10 секунд, ноDbOrganisation
у меня все еще есть 50 кредитов
Что я делаю не так? Я думал FirstOrDefault
, что вызов не был кэширован по умолчанию?
Ответ №1:
Вы все делаете правильно, именно так работает EF.
Вы можете использовать .AsNoTracking()
для своих целей:
var dbOrganisation = repository.DbOrganisation.AsNoTracking().FirstOrDefault(c => c.Id == id);
Расширения DbExtensions.Метод AsNoTracking: возвращает новый запрос, в котором возвращенные объекты не будут кэшироваться в DbContext или ObjectContext.