.NET 6 Minimal API 配置如何在 Entity Framework Core CLI 工具中使用
.NET 6 Minimal API 下 EF Core 迁移工具适配标准方案
方案一:无需额外编写设计时工厂(推荐)
EF Core 6 及以上版本的工具原生支持 Minimal API 的顶级语句写法,出现适配问题通常是版本不匹配或者命令参数缺失导致,按以下步骤操作即可复用原有配置逻辑:
- 保证版本一致性
项目引用的Microsoft.EntityFrameworkCore相关包版本、全局dotnet-ef工具版本必须和你使用的 .NET SDK 版本完全匹配,.NET 6 RC1 对应的工具升级命令为:dotnet tool update --global dotnet-ef --version 6.0.0-rc.1.21452.10 - 执行迁移命令时指定启动项目
运行dotnet ef相关命令时,通过--startup-project参数指定你的 Minimal API 项目(即存放appsettings.json配置的项目),即可让工具自动读取配置、识别注册的DbContext服务,无需额外编码。
示例命令(假设 DbContext 存放在单独的MyApp.Data类库项目,启动项目为同级的MyApp.Api项目):
执行更新数据库命令同理:# 在 MyApp.Data 项目目录下执行 dotnet ef migrations add InitialCreate --startup-project ../MyApp.Api/MyApp.Api.csprojdotnet ef database update --startup-project ../MyApp.Api/MyApp.Api.csproj
方案二:规范的设计时工厂实现
如果确实需要自定义设计时的 DbContext 构建逻辑,可以按照以下规范实现工厂,无需硬编码连接字符串:
EF Core 设计时工具运行时会自动将工作目录设置为启动项目的根目录,同时继承当前环境的 ASPNETCORE_ENVIRONMENT 环境变量,直接复用运行时的配置加载逻辑即可:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; using System.IO; using System; public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<MyContext> { public MyContext CreateDbContext(string[] args) { IConfigurationRoot configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Development"}.json", optional: true) .Build(); var optionsBuilder = new DbContextOptionsBuilder<MyContext>(); optionsBuilder.UseNpgsql(configuration.GetConnectionString("MyConnectionString")); return new MyContext(optionsBuilder.Options); } }
常见注意事项
- 确保
MyContext接收DbContextOptions<MyContext>参数的构造函数为公开访问级别,否则工具无法反射构造实例 - 不要在
Program.cs中的app.Run()之前添加特殊的拦截逻辑跳过服务构建,工具会自动执行到应用构建完成的阶段,不需要实际启动Web服务 - 若启动项目需要额外的命令行参数,可以在命令末尾通过
--分隔传入,例如:dotnet ef migrations add InitialCreate --startup-project ../MyApp.Api -- /customArg value
内容的提问来源于stack exchange,提问作者Krzysztof Skowronek
相关产品推荐
相关产品推荐

