Как отключить отслеживание сущности в Entity Framework?

«Как отключить отслеживание сущности в Entity Framework?» — вопрос из категории Entity Framework, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Entity Framework Core есть несколько способов отключить механизм отслеживания изменений (change tracking) для сущностей, что полезно для операций только для чтения и повышения производительности.

Основные методы:

  1. AsNoTracking() — отключает отслеживание для результатов конкретного запроса.

    var users = context.Users.AsNoTracking().ToList();
  2. AsNoTrackingWithIdentityResolution() — аналогичен AsNoTracking, но обеспечивает разрешение идентичности: если в результате запроса встречается одна и та же сущность (по ключу) несколько раз, будет возвращен один и тот же экземпляр объекта. Это полезно для предотвращения дублирования в графах объектов.

  3. Глобальная настройка контекста — можно установить поведение по умолчанию для всех запросов данного контекста.

    services.AddDbContext<AppDbContext>(options =>
        options.UseSqlServer(connectionString)
               .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));

    После этого для запросов, требующих отслеживания, нужно явно использовать .AsTracking().

  4. Отсоединение сущности (Detach) — если сущность уже загружена с отслеживанием, её можно отсоединить.

    context.Entry(entity).State = EntityState.Detached;

Когда это нужно:

  • При выполнении запросов только для чтения (отчеты, экспорт данных).
  • При маппинге результатов запроса в DTO или ViewModel.
  • В сценариях с кратковременным контекстом (например, в веб-приложениях), когда изменения не планируется сохранять.

Важно: При отключенном отслеживании любые изменения, внесенные в полученные объекты, не будут автоматически сохранены в базу данных при вызове SaveChanges().