.NET Tutorial

Entity Framework Core

DbContext и Change Tracker, миграции, стратегии загрузки, N+1, транзакции, наследование, raw SQL, интерсепторы и конкурентный доступ.

EF Core — самый частый источник проблем с производительностью в .NET-сервисах. Интервьюер хочет услышать, что вы понимаете, какой SQL генерируется из вашего LINQ, сколько запросов уходит в базу и что хранится в памяти контекста.

  1. 1 Что такое ORM и EF Core: DbContext, DbSet, первые запросы и миграции? ORM (Object-Relational Mapping) — библиотека, которая сопоставляет классы C# с таблицами БД: вы работаете с объектами и LINQ, а ORM генерирует SQL и заполняет объекты ре… Junior6 мин
  2. 2 Как работает DbContext: Unit of Work, Identity Map, Change Tracker? DbContext — сессия работы с БД: запросы, отслеживание изменений, сохранение. Лёгкий, не потокобезопасный, живёт недолго (обычно Scoped — один на HTTP-запрос). Unit of Wo… Middle6 мин
  3. 3 Code First vs Database First vs Model First? Code First — источник истины — C#-классы и конфигурация. Схема БД генерируется и эволюционирует через миграции. Стандарт для новых проектов на EF Core. Database First — … Junior5 мин
  4. 4 Миграции: создание, применение, откат, squash? Миграция — C#-класс с методами Up (применить) и Down (откатить), описывающий изменение схемы. Создаётся командой dotnet ef migrations add Name сравнением текущей модели … Middle7 мин
  5. 5 Lazy Loading vs Eager Loading vs Explicit Loading? Eager loading — связанные данные загружаются сразу вместе с основной сущностью через Include / ThenInclude (JOIN или отдельные запросы при AsSplitQuery). Предсказуемо, к… Junior6 мин
  6. 6 N+1 проблема — как обнаружить и решить? N+1: один запрос загружает список из N записей, затем для каждой записи выполняется ещё по запросу за связанными данными. Итого N+1 запросов вместо 1–2. Причины в EF Cor… Junior6 мин
  7. 7 Как работает AsNoTracking и когда его использовать? AsNoTracking() говорит EF Core не регистрировать загруженные сущности в Change Tracker: не создаются EntityEntry, снимки исходных значений, нет Identity Map. Результат: … Junior5 мин
  8. 8 Транзакции в EF Core: SaveChanges, BeginTransaction, Ambient transactions? SaveChanges сам оборачивает все накопленные изменения в одну транзакцию — для большинства сценариев явная транзакция не нужна. Database.BeginTransactionAsync() — явная т… Middle6 мин
  9. 9 Конфигурация через Fluent API vs Data Annotations? Модель EF Core строится из трёх источников с растущим приоритетом: соглашения (conventions) → Data Annotations (атрибуты на классах) → Fluent API (OnModelCreating). Flue… Junior5 мин
  10. 10 Owned Types, Table Splitting, TPH/TPT/TPC наследование? Owned type (OwnsOne/OwnsMany) — тип без собственной идентичности, принадлежащий сущности-владельцу. Идеален для Value Objects DDD (Address, Money). По умолчанию хранится… Senior7 мин
  11. 11 Raw SQL, FromSql, ExecuteSql — когда уходить от LINQ? FromSql($"...") — запрос, возвращающий сущности (можно продолжить LINQ: Where, Include, OrderBy — EF обернёт SQL в подзапрос). Интерполяция автоматически превращается в … Middle6 мин
  12. 12 Как работает Interceptors и Query Filters в EF Core? Interceptors — перехватчики операций EF Core: выполнение команд (DbCommandInterceptor), сохранение (SaveChangesInterceptor), соединения (DbConnectionInterceptor), транза… Senior6 мин
  13. 13 Оптимизация запросов: compiled queries, split queries, projection? Сначала измерить: логирование SQL, ToQueryString(), план выполнения (EXPLAIN ANALYZE), трассировка. Большинство проблем — в SQL и индексах, а не в EF. Проекция (Select в… Senior6 мин
  14. 14 Конкурентный доступ: Optimistic vs Pessimistic Concurrency? Проблема: два пользователя читают одну запись, оба меняют и сохраняют — второй затирает изменения первого (lost update). Optimistic concurrency — «конфликты редки»: не б… Middle6 мин