.NET 6创建EF迁移时出现StopTheHostException问题求助
EF迁移时触发StopTheHostException的排查方案
创建EF迁移时抛出如下异常,异常指向Program.cs第32行的builder.Build()方法。此前项目中添加过MediatR.DependencyInjection和AutoMapper.DependencyInjection,但暂不认为是问题根源。
异常信息
Microsoft.Extensions.Hosting.HostFactoryResolver+HostingListener+StopTheHostException: Exception of type 'Microsoft.Extensions.Hosting.HostFactoryResolver+HostingListener+StopTheHostException' was thrown. at Microsoft.Extensions.Hosting.HostFactoryResolver.HostingListener.OnNext(KeyValuePair`2 value) at System.Diagnostics.DiagnosticListener.Write(String name, Object value) at Microsoft.Extensions.Hosting.HostBuilder.Build() at Microsoft.AspNetCore.Builder.WebApplicationBuilder.Build() at Program.<Main>$(String[] args) in D:\repos\wisse\src\wisse.API\Program.cs:line 32 Done. To undo this action, use 'ef migrations remove'
相关代码(Program.cs)
using System.Timers; using Serilog; using Serilog.Events; using wisse.Application; using wisse.Domain; using wisse.Infrastructure; var config = new ConfigurationBuilder() .AddJsonFile("appsettings.json").Build(); Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(config) .CreateLogger(); Log.Information("Application Starting..."); try { var builder = WebApplication.CreateBuilder(args); builder.Host.UseSerilog(); // Add services to the container. builder.Services .AddDomain() .AddApplication() .AddInfrastructure(builder.Configuration); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // this is line 32 // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.UseInfrastructure(); app.Run(); } catch (Exception e) { Console.WriteLine(e); throw; }
说明:数据库配置和DbContext均通过.AddInfrastructure(builder.Configuration)和app.UseInfrastructure();注册,项目为.NET 6,仅包含两个自定义实体及Microsoft.AspNetCore.Identity.EntityFrameworkCore相关表。
排查思路
- 验证DbContext的注册与配置
确认AddInfrastructure方法中是否正确注册了DbContext,连接字符串是否有效。可以尝试临时替换为直接注册DbContext的代码,排除Infrastructure层其他服务的干扰:builder.Services.AddDbContext<YourDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); - 为EF迁移简化主机构建逻辑
EF迁移不需要完整的Web应用服务(如Swagger、授权中间件等)。可以通过命令行参数判断是否为迁移操作,仅注册必需服务:var isMigrationCommand = args.Any(arg => arg.Equals("migrations", StringComparison.OrdinalIgnoreCase)); if (!isMigrationCommand) { builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); } - 排查Serilog的影响
暂时移除builder.Host.UseSerilog(),重新执行迁移命令,确认是否是日志组件与主机构建的冲突导致异常。 - 检查Infrastructure层的启动逻辑
查看app.UseInfrastructure()方法内部是否包含会触发主机停止的代码,比如未捕获的异常、调用终止主机的方法等。 - 获取真实异常根源
修改catch块输出内部异常信息,StopTheHostException通常是包装后的异常,真实错误在InnerException中:catch (Exception e) { Console.WriteLine($"错误信息:{e.Message}"); Console.WriteLine($"内部错误:{e.InnerException?.Message ?? "无"}"); Console.WriteLine($"堆栈跟踪:{e.StackTrace}"); throw; }
内容的提问来源于stack exchange,提问作者drozdgabriel
相关产品推荐
相关产品推荐

