Планирование для Entity Framework Core 7.0

Как описано в процессе планирования, мы собрали входные данные заинтересованных лиц в план Entity Framework Core 7.0 (EF Core 7.0.) Для краткости EF Core 7.0 также называется ef7.

Важно!

Этот план не является обязательством; он будет развиваться по мере того, как мы продолжаем учиться на протяжении всего выпуска. Некоторые вещи, которые в настоящее время не запланированы для EF7, могут быть извлечены. Некоторые вещи, которые планируется в настоящее время для EF7, могут быть отложены.

Общая информация

EF Core 7.0 является следующим выпуском после EF Core 6.0 и в настоящее время запланирован на выпуск в ноябре 2022 года в то же время, что и .NET 7. Нет планов для выпуска EF Core 6.1.

Поддерживаемые платформы

EF7 в настоящее время предназначен для .NET 6. Это может быть обновлено до .NET 7, так как мы приближаемся к выпуску. EF7 не предназначен для любой версии .NET Standard; Дополнительные сведения см . в будущем .NET Standard. EF7 не будет работать в платформа .NET Framework.

EF7 будет соответствовать политике поддержки .NET и поэтому не будет долгосрочным выпуском поддержки (LTS).

Критические изменения

EF7 будет содержать небольшое количество критических изменений , так как мы продолжаем развивать как EF Core, так и платформу .NET. Наша цель заключается в том, чтобы минимизировать критические изменения как можно больше.

Themes

Крупные инвестиции в EF7 будут в основном подпадать под следующие темы:

  • Самые востребованные возможности
  • Платформы и экосистема NET
  • Очистить путь вперед из EF6
  • Производительность

Каждая из этих тем подробно описана ниже. Высокий уровень состояния каждой темы можно отслеживать в двухдневных обновлениях EF Core. Закомментируйте вопрос GitHub #26994 с любыми отзывами или предложениями.

Тема: высоко запрошенные функции

Как всегда, основное участие в процессе планирования происходит от голосов (👍) для функций на GitHub. На основе этих голосов в дополнение к другим факторам мы планируем работать над следующими высоко запрошенными функциями для EF7.

Столбцы JSON

Отслеживаемая проблемой #4021: сопоставление значений JSON, хранящихся в базе данных, с свойствами EF

Полезное предложение: сохранение и запрос в документы на основе JSON, хранящиеся в столбцах реляционной базы данных.

Эта возможность позволит определить общие механизмы и шаблоны для поддержки JSON, которые могут быть реализованы любым поставщиком базы данных. Мы планируем совместно с участниками сообщества согласовать существующие реализации для Npgsql и Pomelo MySQL, а также добавить поддержку для SQL Server и SQLite.

Массовые обновления

Отслеживаемая проблемой #795: массовые (т. е. на основе наборов) операции CUD (без загрузки данных в память)

Полезное предложение: эффективные, предикатные обновления для многих строк базы данных без загрузки данных в память.

Отслеживание изменений, за которым следует SaveChanges , является основным механизмом в EF Core для вставки, обновления и удаления сущностей. Этот механизм гарантирует, что операции базы данных упорядочены для удовлетворения ограничений, а отслеживаемые сущности хранятся в синхронизации с изменениями, внесенными в базу данных. Однако для создания соответствующих команд базы данных требуется циклический обход базы данных для загрузки сущностей в память для создания соответствующих команд базы данных, за которым следует циклический обход базы данных для выполнения этих команд.

В отличие от этого, массовые или наборные обновления включают определение изменений, которые необходимо вносить в базу данных, а затем выполнять эти изменения без первой загрузки сущностей в память. Это может быть значительно быстрее, чем отслеживаемые обновления, особенно если одно и то же изменение должно применяться ко многим различным сущностям и строкам.

Для EF7 мы планируем реализовать массовые обновления и удаления (но не вставки). Обратите внимание, что массовые обновления не совпадают с пакетным обновлением. EF Core уже объединяет изменения во многих отслеживаемых сущностях в пакеты при отправке обновлений в базу данных через SaveChanges.

Перехватчики жизненного цикла

Отслеживаемый по проблеме No 626: перехватчики жизненного цикла

Полезное предложение: разрешить приложениям реагировать на интересные вещи в коде EF.

Перехватчики жизненного цикла позволяют получать уведомления о приложении или библиотеке при возникновении определенных интересных условий или действий для сущностей, свойств, связей, запросов, экземпляров контекста и других конструкций EF. Мы реализовали множество перехватчиков жизненного цикла в предыдущих версиях EF Core, включая различные перехватчики и события. Для EF7 мы планируем добавить важные отсутствующие крючки. Например, перехватчик для манипуляции экземплярами сущностей после их создания, который называется ObjectMaterialized.

Сопоставление табличного типа (TPC)

Отслеживаемый по проблеме #3170: шаблон сопоставления наследования TPC

Предложение ценности: сопоставление сущностей в иерархии с отдельными таблицами без попадания в производительность сопоставления TPT.

EF Core поддерживает сопоставление таблиц на иерархию (TPH) и таблиц на тип (TPT) для иерархий наследования .NET. Сопоставление табличного типа на конкретный тип (TPC) аналогично сопоставлению TPT в том, что каждый тип сущности в иерархии сопоставляется с другой таблицей базы данных. Однако, хотя TPT сопоставляет свойства из базового типа с столбцами в таблице базового типа, TPC сопоставляет свойства базового типа с той же таблицей, что и фактически сопоставленный конкретный тип. Это может привести к значительно более быстрой производительности, так как при запросе конкретного типа не требуется присоединяться к нескольким таблицам. Это происходит за счет денормализации данных, так как столбцы дублируются в таблицах, сопоставленных с каждым конкретным типом в иерархии.

Работа по сопоставлению TPC также охватывает более общее разделение сущностей и поддержку указания различных аспектов на таблицу в TPT, TPC или делении сущностей.

Сопоставление операций CUD с хранимыми процедурами

Отслеживаемая проблемой #245: сопоставление вставок, обновлений и удалений (операций CUD) с хранимыми процедурами

Предложение ценности: используйте хранимые процедуры для управления изменениями данных.

EF Core уже поддерживает запрос данных из хранимых процедур. Эта функция позволит сопоставить вставки, обновления и удаления, созданные хранимыми SaveChanges процедурами в базе данных.

Объекты значений

Отслеживаемая по проблеме #9906: использование структур или классов C# в качестве объектов значений

Полезное предложение. Приложения могут использовать объекты значений в стиле DDD в моделях EF.

Ранее наша команда разработчиков полагала, что принадлежащие сущности, которые предназначены для поддержки статистических вычислений, также целесообразно использовать для аппроксимации объектов значений. Однако опыт показал, что это не так. Таким образом, в EF7 мы планируем внедрить лучший интерфейс, ориентированный на потребности объектов значений в проектировании на основе домена. Этот подход будет основываться на преобразователях значений, а не на принадлежащих сущностях.

Изначально объем работы в этом направлении ограничен поддержкой преобразователей значений, которые сопоставляются с несколькими столбцами. Возможно, с учетом полученных в процессе работы над выпуском отзывов будет реализована дополнительная поддержка.

Поддержка создания значений при использовании преобразователей значений

Отслеживаемая проблемой #11597: поддержка дополнительных типов создания значений с помощью преобразователей

Предложение о ценности: инкапсулированные типы ключей в стиле DDD могут полностью использовать автоматически созданные значения ключей.

EF Core 6.0 позволяет использовать больше типов создания значений с ключами, сопоставленными с преобразователями значений. Мы планируем обобщить и расширить эту поддержку в EF7.

Необработанные запросы SQL для несопоставленных типов

Отслеживаемая по проблеме #10753: поддержка необработанных ЗАПРОСОВ SQL без определения типа сущности для результата

Полезное предложение. Приложения могут выполнять больше типов необработанных SQL-запросов, не уменьшая ADO.NET или используя сторонние библиотеки.

В настоящее время необработанные запросы SQL должны возвращать тип в модели либо без ключа. В EF7 мы планируем разрешить необработанные sql-запросы, которые напрямую возвращают типы, которые не содержатся в модели EF.

В этой статье также рассматриваются необработанные запросы SQL, возвращающие простые или скалярные типы, такие как Guid, DateTimeиintstring.

Шаблоны шаблонов баз данных

Отслеживаемая проблемой #4038: шаблоны кода для шаблонов типов сущностей и DbContext из существующей базы данных

Предложение ценности: код, созданный с помощью dotnet ef database scaffold , можно полностью настроить.

Мы часто получаем запросы на корректировку кода, созданного при создании шаблонов (обратной инженерии) из существующей базы данных. Мы планируем устранить эти запросы в EF7, поддерживая шаблоны T4 для созданных типов сущностей и DbContext. Разработчики смогут настраивать стандартные шаблоны или создавать новые шаблоны с нуля.

Тема: платформы и экосистемы .NET

Большая часть работы, запланированной для EF7, включает улучшение возможностей доступа к данным для .NET на разных платформах и доменах. Это включает в себя работу в EF Core, где это необходимо, но также работает в других областях, чтобы обеспечить отличный опыт работы в технологиях .NET. Мы сосредоточимся на следующих платформах и технологиях выпуска EF7:

Этот список основан на многих факторах, включая данные клиентов, стратегическое направление и доступные ресурсы. Общие области, над которыми мы будем работать на этих платформах, описаны ниже.

Распределенные транзакции

Отслеживаемая проблемой #715 в dotnet/runtime: реализация распределенных и промоутированных транзакций в System.Transactions

Полезное предложение: платформа .NET Framework приложения с использованием распределенных транзакций можно перенести в .NET 7.

Библиотека System.Transactions в платформа .NET Framework содержит машинный код, который использует координатор распределенных транзакций Windows (DTC) для поддержки распределенных транзакций. Этот код никогда не был перенесен в .NET Core. В период времени .NET 7 мы планируем исследовать и начать процесс привлечения этой функции к современной платформе .NET. Изначально это будет использоваться только для Windows и будет поддерживать только сценарии базы данных, в которых поставщик ADO.NET также поддерживает распределенные транзакции. Другие использование распределенных транзакций, например в WCF, не будет поддерживаться в .NET 7. На основе отзывов и затрат мы можем реализовать поддержку других сценариев и (или) платформ, отличных от Windows, в будущем выпуске.

Инструменты EF Core

Отслеживаемая проблема No 26798: модернизация инструментов EF Core

Полезное предложение: dotnet ef команды легко использовать и работать с современными платформами и технологиями.

Платформы .NET развивались с тех пор, как мы впервые представили средства для миграции, шаблонов баз данных и т. д. в EF Core 1.0. В EF7 мы планируем обновить архитектуру инструментов для повышения поддержки новых платформ, таких как .NET MAUI, и упростить процесс в таких областях, как использование нескольких проектов. Это включает в себя предоставление лучшей обратной связи, когда вещи идут не так, лучше интеграция с ведением журнала, производительностью и новым сахаром.

EF Core и графические пользовательские интерфейсы

Отслеживаемая проблема No 26799: улучшение возможностей привязки данных и графических интерфейсов

Полезное предложение: легко создавать графические приложения, привязанные к данным, с помощью EF Core.

EF Core предназначен для эффективной работы с сценариями привязки данных, например в Windows Forms и .NET MAUI. Однако соединение точек между этими технологиями не всегда легко. Для EF7 мы планируем улучшить работу как в EF Core, так и в Visual Studio, чтобы упростить создание приложений, связанных с данными, с помощью EF Core.

SqlServer.Core (Woodstar)

Отслеживается в репозитории лаборатории данных .NET

Полезное предложение: быстрый, полностью управляемый доступ к SQL Server и SQL Azure для современных приложений .NET.

Microsoft.Data.SqlClient — это полнофункциональный поставщик базы данных ADO.NET для SQL Server. Он поддерживает широкий спектр возможностей SQL Server в .NET Core и .NET Framework. Однако при этом он содержит большую устаревшую базу кода с множеством сложных взаимосвязей. Это затрудняет изучение потенциальных достижений, которые можно сделать с помощью новых функций .NET Core.

Мы начали проект в прошлом году, коллоквиально известный как Woodstar, чтобы исследовать потенциал для высокопроизводительного драйвера SQL Server для .NET. Мы планируем внести значительные дальнейшие инвестиции в этот проект в рамках временных периодов EF7.

Важно!

Работа над Microsoft.Data.SqlClient при этом продолжится в прежнем объеме. Это будет по-прежнему рекомендуемый способ подключения к SQL Server и Azure SQL, как с EF Core, так и без него. Также этот поставщик будет поддерживать появляющиеся новые возможности SQL Server.

Поставщик Azure Cosmos DB

Отслеживаемые проблемы, помеченные как "area-cosmos" и в вехе 7.0

Предложение о ценности. Продолжайте делать EF Core самым простым и наиболее продуктивным способом работы с Azure Cosmos DB.

Мы улучшили поставщик базы данных EF Core Azure Cosmos DB для выпуска 6.0. Эти улучшения создали первый класс для работы с Azure Cosmos DB из EF Core, что отражается на значительном росте внедрения. Мы планируем продолжить этот импульс в EF7 с помощью следующих дополнительных улучшений поставщика Azure Cosmos DB:

Обязательно проголосуйте (👍) за функции поставщика Azure Cosmos DB, которые вам нужны, чтобы мы могли оценить, где инвестировать в большую выгоду.

Интерфейс миграции

Исправлена проблема 22946: улучшения миграции баз данных

Полезное предложение: легко приступить к миграции и более поздних версий эффективно использовать их в конвейерах CI/CD.

EF Core 6.0 представила пакеты миграций, значительно улучшая возможности развертывания облачных приложений и баз данных в системах непрерывной интеграции и развертывания. В EF7 мы планируем внести дополнительные улучшения в этой области на основе отзывов клиентов. Например, мы планируем поддерживать выполнение всех миграций в одной транзакции , чтобы упростить восстановление, если что-то не так.

Кроме того, мы планируем улучшить интерфейс для разработчиков, приступая к работе с миграцией. Это включает в себя возможность автоматического создания базы данных при обучении или запуске проекта, а затем легко переключаться на управляемые миграции по мере развития проекта. Кроме того, для проектов с существующей базой данных мы планируем упростить создание начальной модели EF, а затем переключиться на управление базой данных с помощью миграций .

Современная .NET

Так как .NET продолжает развиваться, мы хотим убедиться, что доступ к данным по-прежнему является большим опытом. Чтобы упростить это, мы планируем добиться прогресса в трех областях в течение периода времени EF7.

Обрезка

Исправлена проблема No 21894: улучшение поддержки обрезки приложений EF Core для уменьшения размера приложения

Полезное предложение: небольшие приложения, которые могут быть эффективно скомпилированы AOT.

EF Core создает большой объем кода во время выполнения. Это может стать проблемой для моделей приложений, которые зависят от встряхивания дерева компоновщика, таких как Xamarin и Blazor, а также для платформ, не допускающих динамическую компиляцию, таких как iOS. Мы планируем значительно улучшить обрезку неиспользуемого кода в EF7. Это упрощает меньшие размеры сборок при использовании EF Core, что помогает развертывать и делать компиляцию заранее (AOT) более эффективной.

Развитие System.Linq.Expression

Полезное предложение. Использование современных функций языка C# в запросах LINQ.

Мы работаем с командой Roslyn по плану, чтобы обеспечить использование дополнительных функций C# в выражениях LINQ. Это продолжающаяся работа, которая в основном будет отслеживаться за пределами репозитория EF Core.

Перевод новых операторов LINQ

Исправлена проблема No 25570: поддержка новых функций .NET LINQ

Предложение по значению: при переводе запросов LINQ в SQL используйте новые операторы LINQ.

Новые операторы LINQ недавно добавлены в BCL, и мы ожидаем, что будет добавлено больше. Проблема #25570 отслеживает добавление поддержки для них в поставщик EF7 LINQ. Эта проблема будет обновлена по мере добавления новых операторов LINQ. Как и во всех существующих операторах LINQ, мы добавим поддержку только в том случае, если оператор имеет разумный и полезный перевод в базу данных.

Открытие телеметрии для поставщиков ADO.NET

Отслеживаемая по проблеме #22336: standardize on DiagnosticSource/OpenTelemetry для трассировки базы данных

Ценность предложения: кроссплатформенная, стандартная телеметрия, которую можно отслеживать в выбранном инструменте.

Открытая телеметрия — это инициатива Cloud Native Foundation для содействия общему механизму телеметрии для облачного программного обеспечения. В отношении баз данных это включает создание стандарта телеметрии клиента базы данных. Мы планируем выполнить работу в временном интервале EF7, чтобы помочь предоставить открытые данные телеметрии для ADO.NET поставщиков в экосистеме .NET. Это включает в себя работу с сообществом на открытый код поставщиков MySQL и Npgsql, а также Microsoft.Data.Sqlite. Мы также будем обращаться к другим поставщикам, и мы рекомендуем поддерживать ADO.NET поставщиков, чтобы получить связь, если это интересно.

Улучшения в System.Data

Отслеживаемые проблемы в репозитории dotnet\runtime, area-System.Data помеченном в вехе 7.0.

Полезное предложение: более низкий доступ к данным для получения преимуществ для всех более высокого уровня кода.

Как и при каждом выпуске, мы намерены изучить улучшения. API доступа к базам данных низкого уровня NET, System.Data. Мы сосредоточимся на улучшении производительности (например, сокращение выделения памяти путем устранения бокса при использовании API), а также некоторых улучшений удобства использования.

Область точных улучшений будут определены позже на основе возможности.

Исследование доступа к данным для облачной среды

Полезное предложение: дальнейшее развитие доступа к данным .NET, которое поддерживает современные подходы, такие как микрослужбы и собственные облачные.

В периоде времени EF7 мы планируем изучить современные подходы к доступу к данным на платформах .NET, особенно в отношении микрослужб и облачных приложений. Это исследование поможет повысить будущие инвестиции в технологии доступа к данным для .NET.

Тема: очистка пути вперед от EF6

Исправлена проблема с документами No 1180: укажите более полное руководство по переносу из EF6

Предложение о ценности: легко переместить приложение из EF6 в EF7.

EF Core всегда поддерживает множество сценариев, которые не охватываются устаревшим стеком EF6, а также обычно гораздо выше. Однако EF6 также поддерживает сценарии, не охватываемые EF Core. EF7 добавит поддержку для многих из этих сценариев, что позволяет больше приложений переноситься из устаревшей версии EF6 в EF7. В то же время мы планируем комплексное руководство по переносу приложений, переходящих от устаревшей версии EF6 к EF Core.

Большая часть работы в этой теме перекрывается уже описанной выше работой. Ниже приведены некоторые из наиболее важных рабочих элементов:

Кроме того, мы планируем сделать его понятным для устаревшего репозитория EF6 GitHub, что мы не планируем никакой будущей работы с EF6. Исключением из этого является то, что мы планируем добавить поддержку использования EF6 с Microsoft.Data.SqlClient. Это будет ограничено поддержкой среды выполнения. Использование конструктора EF6 в Visual Studio по-прежнему требуется System.Data.SqlClient.

Обратите внимание, что EF Core имеет принципиально другую архитектуру для EF6. В частности, он не использует спецификацию модели данных сущности (EDM). Это означает, что некоторые функции, такие как EDMX и EntitySQL, никогда не будут поддерживаться в EF Core.

Тема: производительность

Большая производительность — это фундаментальный принцип ДОСТУПА к данным EF Core, доступ к данным нижнего уровня и действительно весь .NET. Каждый выпуск включает значительную работу по повышению производительности. Как всегда, эта тема будет включать много итеративного исследования, которое затем будет информировать о том, где мы сосредоточим ресурсы.

Производительность вставок и обновлений базы данных

Исправлена проблема 26797: повышение производительности отслеживания изменений и обновления

Полезное предложение: высокопроизводительная база данных вставляет и обновляется из EF Core.

За последние несколько выпусков мы сосредоточились на повышении производительности EF Core в запросах без отслеживания. Для EF7 мы планируем сосредоточиться на производительности, связанной с вставками и обновлениями базы данных. Это включает в себя производительность запросов отслеживания изменений, производительность и производительность DetectChangesкоманд вставки и обновления, отправленных в базу данных.

Часть этой работы включает реализацию массовых (наборных) обновлений, которые отслеживаются выше как высокозапрашиваемая функция. Однако мы также планируем повысить производительность традиционных обновлений с помощью SaveChanges.

Составная оценка TechEmpower

Отслеживаемый вопросом 26796: повышение производительности в составной оценке TechEmpower

Полезное предложение: высокопроизводительные обновления данных низкого уровня для всех приложений .NET.

На протяжении нескольких лет мы проводим соответствующие отраслевым стандартам тесты производительности TechEmpower для .NET в отношении базы данных PostgreSQL. В последних нескольких выпусках мы значительно улучшили тест Fortunes для доступа к данным низкого уровня и EF Core.

В временном интервале EF7 мы планируем специально целевые улучшения составной оценки TechEmpower. Это измеряет производительность по более широкому спектру сценариев.

Прочие функции

Отслеживаемые проблемы, type-enhancement помеченные в вехой версии 7.0

Полезное предложение: непрерывное улучшение EF Core в соответствии с существующими и изменяющимися требованиями приложения.

Другие функции, запланированные для EF 7.0, включают в себя, но не ограничиваются следующими:

Предложения

Нам важно ваше мнение о планировании. Прокомментируйте вопрос GitHub #26994 с любым отзывом или общими предложениями о плане. Лучший способ указать важность проблемы — голосовать (👍) за эту проблему на сайте GitHub. Эти данные будут учитываться в процессе планирования для следующего выпуска.