You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6 Minimal API 配置如何在 Entity Framework Core CLI 工具中使用

.NET 6 Minimal API 下 EF Core 迁移工具适配标准方案

方案一:无需额外编写设计时工厂(推荐)

EF Core 6 及以上版本的工具原生支持 Minimal API 的顶级语句写法,出现适配问题通常是版本不匹配或者命令参数缺失导致,按以下步骤操作即可复用原有配置逻辑:

  1. 保证版本一致性
    项目引用的 Microsoft.EntityFrameworkCore 相关包版本、全局 dotnet-ef 工具版本必须和你使用的 .NET SDK 版本完全匹配,.NET 6 RC1 对应的工具升级命令为:
    dotnet tool update --global dotnet-ef --version 6.0.0-rc.1.21452.10
    
  2. 执行迁移命令时指定启动项目
    运行 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.csproj
    
    执行更新数据库命令同理:
    dotnet 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:36:06