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