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 集成。
EFScaffoldModelStage 设置为 publishbuildnone 指示将在哪个阶段生成已编译的模型。 默认为 publish
EFPrecompileQueriesStage 设置为 publishbuildnone 指示将生成预编译查询的阶段。 默认为 publish
DbContextName 要使用的派生 DbContext 类。 仅类名或完全限定命名的空间。 如果省略此选项,EF Core 将为项目中的所有上下文类执行生成。
EFTargetNamespace 要用于所有生成的类的命名空间。 如果省略此选项,EF Core 将使用 $(RootNamespace)
EFOutputDir 在编译项目之前放置生成的文件的文件夹。 如果省略此选项,EF Core 将使用 $(IntermediateOutputPath)
EFNullable 是否将在生成的代码中使用可为 null 的引用类型。 如果省略此选项,EF Core 将使用 $(Nullable)

限制

  • publish 阶段使用集成时,还要在启动项目中设置 rid(例如 <RuntimeIdentifier>win-x64</RuntimeIdentifier>)
  • 当使用此方法时,无法指定其他启动项目,因为它会引入反向生成依赖项。 这意味着上下文项目需要在配置方面自动实现,因此,如果你的应用通常在不同的项目中使用主机生成器配置上下文,则需要在上下文项目中实现 IDesignTimeDbContextFactory TContext<>。
  • 由于在生成已编译的模型之前需要编译项目,因此不支持用于自定义已编译模型的分部方法实现。
  • 目前,这将始终在 NativeAOT 所需的已编译模型中生成其他代码。 如果不打算启用 NativeAOT,请使用 CLI 工具生成编译的模型。

其他资源