.NET Core 6.0控制台应用中Code-First模式添加数据库迁移的问题解决(含ConfigureWebHostDefaults定义缺失处理)
先帮你理清两个核心问题: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

