Выбор ответа Senior EF Core обновлено

Пул контекстов и скомпилированные запросы

Вопрос

Профилирование горячего эндпоинта показало заметное время на создание DbContext и перевод LINQ в SQL. Какие механизмы EF Core это сокращают?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: AddDbContextPool и EF.CompileAsyncQuery для запроса. Пул контекстов сбрасывает и переиспользует экземпляры вместо создания новых (но контекст не должен хранить своё состояние в полях).

Варианты ответа

  1. AsNoTracking и Include для всех запросов эндпоинта
  2. AddDbContextPool и EF.CompileAsyncQuery для запросаправильный ответ
  3. Ленивая загрузка через прокси вместо явной загрузки
  4. EnsureCreated при старте, чтобы прогреть модель

Разбор

Пул контекстов сбрасывает и переиспользует экземпляры вместо создания новых (но контекст не должен хранить своё состояние в полях). Скомпилированный запрос избавляет от повторного разбора дерева выражений, хотя EF и так кеширует планы для одинаковых запросов, и выигрыш виден на очень горячих путях. AsNoTracking экономит на отслеживании, а не на создании контекста и трансляции. Ленивая загрузка добавляет запросы. EnsureCreated вообще про создание схемы.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.