Entity Framework Core MSBuild 集成

从 EF 9 开始,可以使用 MSBuild 任务在生成项目或发布项目时自动生成已编译的模型和预编译查询。 这主要是用于 NativeAOT 发布。

警告

NativeAOT 支持和 MSBuild 集成是实验性功能,尚不适合生产用途。

安装任务

若要开始,请安装 Microsoft。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 设置为 publishbuildnone 指示将在哪个阶段生成已编译的模型。 默认为 publish
EFPrecompileQueriesStage 设置为 publishbuildnone,以指示在哪个阶段生成预编译查询。 默认为 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>)
  • 当使用此方法时,无法指定其他启动项目,因为它会引入反向生成依赖项。 这意味着上下文项目需要在配置方面自动实现,因此,如果你的应用通常在不同的项目中使用主机生成器配置上下文,则需要在上下文项目中实现 IDesignTimeDbContextFactory TContext<>。
  • 由于在生成已编译的模型之前需要编译项目,因此不支持用于自定义已编译模型的分部方法实现。
  • 目前,这将始终在 NativeAOT 所需的已编译模型中生成其他代码。 如果不打算启用 NativeAOT,请使用 CLI 工具生成编译的模型。

其他资源