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