Интеграция с MSBuild в Entity Framework Core

Начиная с EF 9, вы можете использовать задачу MSBuild для создания скомпилированной модели и предварительно скомпилированных запросов автоматически при создании проекта или публикации. Это главным образом предназначено для использования с публикацией NativeAOT.

Предупреждение

Поддержка NativeAOT и интеграция MSBuild являются экспериментальными функциями и пока не подходят для использования в рабочей среде.

Установка задач

Чтобы приступить к работе, установите Майкрософт. EntityFrameworkCore.Tasks пакет NuGet. Рассмотрим пример.

dotnet add package Microsoft.EntityFrameworkCore.Tasks

Примечание.

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

Использование задач

Если проект указывает <PublishAot>true</PublishAot> , то по умолчанию задача MSBuild создаст скомпилированную модель и предварительно скомпилированные запросы во время публикации. В противном случае можно задать следующие свойства для управления поведением генерации:

Свойство MSBuild Описание
EFOptimizeContext Установите значение true, чтобы включить интеграцию MSBuild. Только EF Core 9-10; удален в EF Core 11.
EFScaffoldModelStage Установите значение publish, build или none, чтобы указать, на каком этапе будет создана скомпилированная модель. По умолчанию — publish.
EFPrecompileQueriesStage Установите значение publish, build или none, чтобы указать, на каком этапе будут созданы предварительно скомпилированные запросы. По умолчанию — publish.
DbContextName Используемый производный класс DbContext. Имя класса или полное имя с указанием пространства имен. Если этот параметр не указан, EF Core выполнит создание всех классов контекста в проекте.
EFTargetNamespace Пространство имен, используемое для всех созданных классов. Если этот параметр не указан, EF Core будет использовать $(RootNamespace).
EFOutputDir Папка для отправки созданных файлов перед компиляцией проекта. Если этот параметр не указан, EF Core будет использовать $(IntermediateOutputPath).
EFNullable Будет ли использоваться ссылочный тип, допускающий значение NULL, в созданном коде. Если этот параметр не указан, EF Core будет использовать $(Nullable).

Примечание.

Начиная с EF Core 11, EFOptimizeContext свойство было удалено. Свойства EFScaffoldModelStage и EFPrecompileQueriesStage теперь работают независимо и не требуют дополнительного флага активации.

Ограничения

  • При использовании интеграции на стадии publish также задайте rid в проекте запуска (например, "<RuntimeIdentifier>win-x64</RuntimeIdentifier>").
  • Другой запускаемый проект нельзя указать при использовании этого подхода, так как это приведет к обратной зависимости сборки. Это означает, что проект контекста должен быть самодостаточен с точки зрения конфигурации, поэтому если приложение обычно настраивает контекст с помощью host builder в другом проекте, следует реализовать IDesignTimeDbContextFactory<TContext> в контекстном проекте.
  • Так как проект должен быть скомпилирован до создания скомпилированной модели, этот подход не поддерживает реализации частичных методов для настройки скомпилированной модели.
  • В настоящее время это всегда создает дополнительный код в скомпилированной модели, которая требуется для NativeAOT. Если вы не планируете включить NativeAOT, создайте скомпилированную модель с помощью средств CLI.

Дополнительные ресурсы