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

.NET Core 6.0控制台应用中Code-First模式添加数据库迁移的问题解决(含ConfigureWebHostDefaults定义缺失处理)

解决.NET Core 6.0控制台应用Code-First迁移问题及Host配置错误

先帮你理清两个核心问题:ConfigureWebHostDefaults不存在的错误,以及如何正确添加Code-First迁移。


一、修复Host初始化的错误

你用了ConfigureWebHostDefaults,但这个方法是给ASP.NET Core Web项目(比如MVC、API)设计的——控制台应用的Host.CreateDefaultBuilder根本没有这个扩展方法,这就是报错的原因。

控制台项目的Host配置应该用ConfigureServices来注册服务,不需要依赖Web项目的Startup模式(当然你也可以保留Startup类,但要手动调用它的配置方法)。

方案1:直接在Host中注册DbContext(推荐,更简洁)

修改你的Program.cs代码,去掉ConfigureWebHostDefaults,改用ConfigureServices直接注册DbContext:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = Host.CreateDefaultBuilder(args)
    .ConfigureServices((context, services) =>
    {
        // 直接从Host的上下文获取配置,不需要手动构建ConfigurationBuilder
        services.AddDbContext<DataScrapperContext>(options => 
            options.UseSqlServer(context.Configuration.GetConnectionString("DefaultConnection")));
    })
    .Build();

// 如果需要运行控制台逻辑,添加下面的代码
await host.RunAsync();

注意:Host.CreateDefaultBuilder已经自动加载了appsettings.json,所以你不需要手动构建ConfigurationBuilder,直接用context.Configuration就能读取配置。

方案2:保留Startup类(如果一定要用)

如果你想继续使用Startup类,需要手动在ConfigureServices中调用它的配置方法:

// Startup.cs保持你的注册逻辑不变
public class Startup
{
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<DataScrapperContext>(options => 
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    }
}

// Program.cs修改为:
var host = Host.CreateDefaultBuilder(args)
    .ConfigureServices((context, services) =>
    {
        var startup = new Startup(context.Configuration);
        startup.ConfigureServices(services);
    })
    .Build();

await host.RunAsync();

二、正确添加Code-First数据库迁移

解决Host配置后,按以下步骤完成迁移:

1. 安装必要的NuGet包

确保你的控制台项目安装了这些包(缺一不可):

  • Microsoft.EntityFrameworkCore:EF Core核心库
  • Microsoft.EntityFrameworkCore.SqlServer:SQL Server提供程序(如果你用其他数据库,替换成对应的包)
  • Microsoft.EntityFrameworkCore.Tools:迁移工具包(提供Add-Migration、Update-Database命令)

可以通过NuGet包管理器安装,或者在Package Manager Console(PMC)中运行:

Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools

2. 设置启动项目和默认项目

打开PMC:

  • 确保默认项目选择你的控制台项目(或者DbContext所在的类库项目,如果DbContext不在控制台项目里)
  • 确保启动项目是你的控制台项目

3. 创建迁移

在PMC中运行命令:

Add-Migration InitialCreate

InitialCreate是迁移的名称,你可以换成自己的命名(比如AddUserTable)。

4. 更新数据库

迁移创建完成后,运行命令将迁移应用到数据库:

Update-Database

备选:使用.NET CLI命令

如果你习惯用CLI,在项目根目录运行:

dotnet ef migrations add InitialCreate --startup-project YourConsoleProjectName
dotnet ef database update --startup-project YourConsoleProjectName

三、常见坑点排查

  • appsettings.json未复制到输出目录:右键appsettings.json → 属性 → 设置“复制到输出目录”为如果较新则复制或始终复制,否则程序运行时找不到配置文件,连接字符串会读取失败。
  • 迁移工具找不到DbContext:确保DbContext已正确注册到DI容器,且启动项目设置正确。如果DbContext在类库项目中,需要用--Project参数指定类库项目:
    Add-Migration InitialCreate --Project YourDataLibraryProject --StartupProject YourConsoleProject
    

内容的提问来源于stack exchange,提问作者Muhammad Kamran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:54:08