Entity Framework

Entity Framework (EF) — объектно-реляционный маппер (ORM) для платформы .NET, разработанный компанией Microsoft. Фреймворк позволяет работать с данными с помощью языковых конструкций C# вместо прямого написания SQL-запросов, автоматически сопоставляя классы (POCO-модели) и их свойства с таблицами и столбцами реляционной базы данных, генерируя необходимый SQL-код и управляя изменениями[2].

Что важно знать
Entity Framework
англ. Entity Framework
Область использования Разработка программного обеспечения, Microsoft .NET, Системы управления базами данных
Дата появления 11 августа 2008[1]
Место появления в составе .NET Framework 3.5 SP1 и Visual Studio 2008 SP1[1]
Автор понятия Microsoft

Определение

Entity Framework — это технологический слой, который:

  • устанавливает объектно-реляционное отображение (mapping) между доменной моделью и схемой базы данных;
  • обеспечивает выполнение запросов к данным через LINQ to Entities и их трансляцию в SQL;
  • предоставляет класс DbContext как единую «единицу работы» (Unit of Work), отвечающую за подключение, отслеживание состояний сущностей и сохранение изменений;
  • автоматически формирует SQL-команды INSERT, UPDATE и DELETE на основе зафиксированных изменений[3].

Ранние версии (EF 1 — EF 6)

Первая версия, Entity Framework (EFv1), была выпущена Microsoft 11 августа 2008 года в составе пакета обновления 1 для .NET Framework 3.5 и Visual Studio 2008. Фреймворк был разработан как часть технологии доступа к данным ADO.NET[4]. Начальная версия предоставляла базовую функциональность ORM с подходом «Database First», при котором модель данных генерировалась на основе существующей базы данных, однако столкнулась с критикой со стороны сообщества разработчиков[5].

Последующие версии значительно расширили возможности фреймворка. Вышедшая в 2010 году вместе с .NET Framework 4.0 версия EF 4.0 добавила поддержку POCO-объектов, ленивую загрузку (lazy loading)[5], а также представила подходы «Model First» и «Code First»[6]. Важным этапом в развитии стала версия EF 6, выпущенная в 2013 году. С этого момента фреймворк стал проектом с открытым исходным кодом под лицензией Apache 2.0 и начал поставляться отдельно от .NET Framework в виде пакета NuGet[7]. Классическая ветка Entity Framework продолжала получать обновления: в октябре 2017 года была выпущена версия EF 6.2.

EF Core 1.x и 2.x: Становление и развитие

В 2017 году выходили преимущественно исправления для ветки 1.1. Версия EF Core 1.1.1, выпущенная 7 марта 2017 года вместе с Visual Studio 2017, содержала исправления ошибок и обновлённые инструменты для работы с миграциями[8]. 20 сентября того же года вышла версия 1.1.3[9]. Ключевым событием стал выход EF Core 2.0 14 августа 2017 года, одновременно с .NET Core 2.0. Этот релиз добавил ряд важных функций, таких как фильтры запросов на уровне модели (model-level query filters), позволяющие реализовывать «мягкое удаление» и мультиарендность, явно компилируемые запросы для повышения производительности и поддержку Owned Types[10][11]. Также была улучшена трансляция LINQ в SQL, что сократило число случаев выполнения части логики на стороне клиента[11].

30 мая 2018 года вышла версия EF Core 2.1, которая представила одну из самых ожидаемых функций — отложенную загрузку (lazy loading). Среди других нововведений были преобразование значений (value conversions), улучшенная трансляция оператора GroupBy в SQL, механизм начального заполнения данных (data seeding) и типы запросов (query types) для работы с представлениями баз данных[12]. Завершающим релизом в этой ветке стал EF Core 2.2, выпущенный 4 декабря 2018 года. Он добавил поддержку пространственных данных (spatial data), коллекций принадлежащих сущностей (collections of owned entities) и тегов запросов (query tags) для упрощения идентификации SQL-запросов в логах[13].

Поддержка версий EF Core 1.x была прекращена 27 июня 2019 года, а EF Core 2.2 — 23 декабря 2019 года[14].

EF Core 3.x: Переработка и стабилизация

Выпущенный 23 сентября 2019 года EF Core 3.0 стал знаковым релизом, содержащим ряд критических изменений. Ключевым нововведением стала полная переработка механизма LINQ, направленная на повышение предсказуемости и производительности запросов. В новой версии фреймворк стремится сгенерировать единый SQL-запрос и, если какая-либо часть запроса не может быть преобразована в SQL, выбрасывает исключение[15]. Это изменило поведение предыдущих версий, которые могли неявно выполнять часть логики на стороне клиента, что иногда приводило к загрузке всей таблицы из базы данных и серьёзным проблемам с производительностью[16]. Среди других нововведений — поддержка C# 8.0, включая асинхронные потоки (IAsyncEnumerable), и новый провайдер для Azure Cosmos DB[17]. Также были внесены критические изменения в API для работы с «сырыми» SQL-запросами[18].

3 декабря 2019 года вышла версия EF Core 3.1, которая была сосредоточена на доработке и стабилизации функциональности, представленной в 3.0. Главной целью этого выпуска стало предоставление версии с долгосрочной поддержкой (Long-Term Support, LTS), которая будет поддерживаться в течение трёх лет. В рамках релиза было исправлено более 150 ошибок, что сделало фреймворк более надёжным для производственного использования[19]. В 2019 году также была прекращена поддержка более ранних версий: 27 июня для EF Core 1.x и 23 декабря для EF Core 2.2.

EF Core 5 и 6: Производительность и новые возможности

Выпущенный 10 ноября 2020 года вместе с .NET 5, EF Core 5.0 представил ряд долгожданных функций, значительно расширивших возможности моделирования данных[20]. Ключевым нововведением стала встроенная поддержка отношений многие-ко-многим без необходимости явного определения промежуточной таблицы[21]. Также была добавлена стратегия сопоставления наследования «таблица на тип» (Table-per-type, TPT)[20]. Для оптимизации производительности сложных запросов появились разделяемые запросы (Split Queries), позволяющие избежать декартова произведения при загрузке нескольких связанных коллекций[21], и фильтруемая загрузка (Filtered Include)[22]. Конфигурация логирования была упрощена благодаря новому методу `LogTo()`.

Следующим важным релизом стала версия EF Core 6.0, выпущенная 10 ноября 2021 года вместе с .NET 6 и получившая статус LTS[23]. Этот выпуск был сосредоточен на значительном повышении производительности: по результатам отраслевого теста TechEmpower, производительность выросла до 70 % по сравнению с EF Core 5.0, а не отслеживаемые запросы стали выполняться на 31 % быстрее при сокращении выделения памяти на 43 %[24]. Среди ключевых нововведений:

  • Темпоральные таблицы: встроенная поддержка для SQL Server, позволяющая автоматически отслеживать историю изменений данных[23].
  • Скомпилированные модели: функция, значительно сокращающая время запуска приложения за счёт предварительной генерации модели данных[23].
  • Пакеты миграций (Migration Bundles): новый способ развёртывания миграций в виде одного исполняемого файла, что упрощает автоматизацию в конвейерах CI/CD[25].
  • Предварительная конфигурация соглашений: возможность централизованно настраивать правила для модели данных, например, задавать длину по умолчанию для всех строковых свойств[25].

EF Core 7 и 8: Расширение возможностей

EF Core 7.0, выпущенный 8 ноября 2022 года вместе с .NET 7, был сфокусирован на расширении возможностей работы с данными и повышении производительности[26]. Несмотря на выход с .NET 7, фреймворк был нацелен на .NET 6, что позволило использовать его с версией LTS[27]. Ключевые нововведения включали:

  • Сопоставление со столбцами JSON: Встроенная поддержка для сохранения и запроса данных из документов JSON, хранящихся в одном столбце реляционной базы данных[28].
  • Массовые операции: Добавлены методы ExecuteUpdate и ExecuteDelete, позволяющие выполнять пакетное обновление и удаление данных напрямую в базе данных без загрузки сущностей в память, что значительно повышает производительность[29].
  • Улучшенная производительность: Были внесены оптимизации в генерацию SQL-кода, что привело к созданию более быстрых запросов в различных сценариях[28].

Следующий релиз, EF Core 8.0, вышел в ноябре 2023 года вместе с .NET 8 и продолжил развитие в сторону более гибкого моделирования и работы со сложными типами данных[30]. Основные нововведения:

  • Комплексные типы: Полноценная поддержка для реализации объектов-значений (value objects), что позволяет лучше структурировать доменную модель в соответствии с принципами DDD[31].
  • Сопоставление коллекций примитивных типов: Возможность сопоставлять коллекции (например, List<int>) со столбцами JSON, что упрощает схему базы данных[32].
  • Поддержка HierarchyId: Встроенная поддержка типа данных HierarchyId для SQL Server, предназначенного для эффективной работы с иерархическими структурами[31].
  • Нативная поддержка DateOnly и TimeOnly: Типы DateOnly и TimeOnly из .NET стали напрямую сопоставляться со столбцами date и time в SQL Server[33].

EF Core 9 и планы на будущее

EF Core 9.0, выпущенный в ноябре 2024 года вместе с .NET 9, продолжил курс на повышение производительности и расширение возможностей запросов[34]. Версия ориентирована на .NET 8, что позволяет использовать её с версией LTS, но также совместима и с .NET 9[35]. Основной фокус был сделан на кардинальной переработке провайдера для Azure Cosmos DB и добавлении экспериментальной поддержки AOT-компиляции[36]. Ключевые нововведения:

  • Улучшения для Azure Cosmos DB: Провайдер был переработан для более эффективной работы. Теперь EF Core может автоматически определять ключ секционирования в LINQ-запросах, направляя их в нужную секцию и снижая затраты, а также выполнять экономичные «точечные чтения» (Point Reads)[35]. Эта переработка привела к ряду критических изменений[37].
  • Расширение возможностей LINQ: Добавлена трансляция функций SQL `GREATEST` и `LEAST` (для SQL Server 2022+)[36], а также возможность группировки (`GroupBy`) по комплексным типам[34].
  • Экспериментальная поддержка AOT: Появилась возможность предварительной компиляции LINQ-запросов на этапе сборки приложения, что значительно сокращает время его запуска. На данном этапе функция не рекомендуется для производственного использования[35][36].
  • Более надёжные миграции: Фреймворк начал выдавать предупреждения, если миграция содержит не транзакционные операции, и ввёл блокировку для предотвращения одновременного запуска нескольких процессов миграции[38].

Планы на EF Core 10, который должен выйти в ноябре 2025 года вместе с .NET 10, включают дальнейшее развитие возможностей работы с современными типами данных. Для работы с этой версией потребуется .NET 10 SDK[39]. Среди ключевых запланированных нововведений:

  • Поддержка векторного поиска: Интеграция с функциями векторного поиска, которые появятся в База данных SQL Azure и SQL Server 2025[39].
  • Улучшения для JSON-столбцов: Возможность использования массовых операций (`ExecuteUpdate`) для данных, хранящихся в формате JSON[39].
  • Именованные фильтры запросов: Возможность определять и многократно использовать именованные фильтры на уровне модели[39].

Примечания