2

Мое понимание структуры Entity Framework заключается в том, что если он сможет ответить на запрос из своего кеша, это произойдет. Моя простая проверка, однако, показывает, повторные запросы попали в базу данных, даже если они были ранее ответили положительно:Выполнение запросов Linq to Entities * всегда * попадание в базу данных?

var u1 = context.Users.SingleOrDefault(u => u.Id == 1); 
var u2 = context.Users.SingleOrDefault(u => u.Id == 1); 

Эти запросы являются успешными. Для каждого я вижу SELECT TOP (2) в SQL Profiler.

Почему EF отправляется в базу данных для этого второго запроса?

ответ

2

Хорошо, потому что EF не использует кеширование. nHibernate делает. Here статья о том, как включить кеширование с помощью EF.

Редактировать: EF не имеет прозрачного кеша из коробки. Но он имеет явный кеш в пределах единицы работы: ObjectContext.GetObjectByKey

+0

Ну, это муха в мазе. Спасибо за информацию и ссылку на решение! – ladenedge

+1

Это не совсем так. Я думаю, вы вводите в заблуждение EF и L2E. LINQ to Entities не использует кэширование по умолчанию, но EF * делает * кешировать материализованные экземпляры в своем контексте. Попробуйте, например, 'ObjectContext.GetObjectByKey' –

+0

@Craig Stuntz i означает прозрачный кеш (например, то, что означало ladgedge). – Andrey

3

EF всегда выполняет запрос, но возвращает тот же экземпляр объекта. Второй запрос не материализуется в новый объект, а экземпляр, созданный первым запросом, возвращается. Вот article об этом поведении. Существуют некоторые дополнительные концепции, которые могут заставить второй запрос, например, обновить существующий экземпляр.

+0

Хорошая статья, спасибо! – ladenedge