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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:14:38