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].
Первая версия, 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.
В 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].
Выпущенный 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.
Выпущенный 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.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.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].


