Вызов FirstOrDefault в entity Framework кэшируется, но база данных изменяется

#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 вызов извлекает не обновленную версию.

Пример ситуации:

  1. Я выполняю FirstOrDefault вызов и вижу десятичное значение поля Credits , равное 50
  2. Третья сторона изменяет значение Credits на 45
  3. Я делаю FirstOrDefault вызов через 10 секунд, но DbOrganisation у меня все еще есть 50 кредитов

Что я делаю не так? Я думал FirstOrDefault , что вызов не был кэширован по умолчанию?

Ответ №1:

Вы все делаете правильно, именно так работает EF.

Вы можете использовать .AsNoTracking() для своих целей:

 var dbOrganisation = repository.DbOrganisation.AsNoTracking().FirstOrDefault(c => c.Id == id);
 

Расширения DbExtensions.Метод AsNoTracking: возвращает новый запрос, в котором возвращенные объекты не будут кэшироваться в DbContext или ObjectContext.