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

.NET 8洋葱架构下EF Core迁移找不到DbContext的问题解决

问题排查:EF Core迁移找不到DbContext的解决方案

问题描述

在.NET 8洋葱架构中,已在持久化层完成DbContext的注册,并在表示层Program.cs中引入该服务,但执行EF Core迁移命令 add-migration mig1 时出现错误:构建成功,但查找'DbContext'类型时抛出异常,路径指向表示层项目 C:\Users\oktay\Desktop\Dev\Presentation\theNewsServer.API。

相关代码

DbContext实现

public theNewsServerDbContext(DbContextOptions options) : base(options)
{

}

public DbSet<Content> Contents { get; set; }
public DbSet<User> Users { get; set; }

public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
{
    var datas = ChangeTracker.Entries<BaseEntity>();

    foreach (var data in datas)
    {
        _ = data.State switch
        {
            EntityState.Added => data.Entity.CreatedDate = DateTime.UtcNow,
            EntityState.Modified => data.Entity.UpdatedDate = DateTime.UtcNow,
            _ => DateTime.UtcNow, 
        };
    }

    return await base.SaveChangesAsync(cancellationToken);
}

持久化层服务注册

public static void AddPersistenceServices(this IServiceCollection services) 
{
    services.AddDbContext<theNewsServerDbContext>(options => options.UseNpgsql(Configuration.ConnectionString));

    services.AddScoped<INewsReadRepository, NewsReadRepository>();
    services.AddScoped<INewsWriteRepository, NewsWriteRepository>();
}

表示层Program.cs

using theNewsService.Persistence;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddPersistenceServices();

builder.Services.AddCors(options => options.AddDefaultPolicy(policy => policy.WithOrigins("http://localhost:4200", "https://localhost:4200")
.AllowAnyHeader()
.AllowAnyMethod()));

问题原因分析

  • DbContext构造函数参数错误:使用了非泛型的DbContextOptions,EF Core无法将配置与特定DbContext类型绑定,导致迁移时无法识别该DbContext。
  • 迁移命令未指定项目:洋葱架构中DbContext位于持久化层,而默认迁移命令从当前项目(表示层)查找,无法定位到DbContext所在程序集。
  • 配置读取逻辑缺陷:Configuration.ConnectionString的读取方式未依赖IConfiguration注入,可能导致连接字符串未正确加载,间接影响DbContext的初始化。

解决方案

1. 修正DbContext构造函数

将构造函数参数改为泛型版本DbContextOptions<theNewsServerDbContext>,确保EF Core能正确关联配置:

public theNewsServerDbContext(DbContextOptions<theNewsServerDbContext> options) : base(options)
{
}

2. 执行迁移时指定项目参数

在Package Manager Console或终端中执行迁移命令时,明确指定DbContext所在的持久化层项目和启动项目:

# Package Manager Console 命令
Add-Migration mig1 -Project theNewsService.Persistence -StartupProject theNewsServer.API

# 终端命令(.NET CLI)
dotnet ef migrations add mig1 --project theNewsService.Persistence --startup-project theNewsServer.API

3. 修复配置读取逻辑

修改持久化层的服务注册扩展方法,注入IConfiguration来读取连接字符串:

public static void AddPersistenceServices(this IServiceCollection services, IConfiguration configuration) 
{
    services.AddDbContext<theNewsServerDbContext>(options => 
        options.UseNpgsql(configuration.GetConnectionString("DefaultConnection")));

    services.AddScoped<INewsReadRepository, NewsReadRepository>();
    services.AddScoped<INewsWriteRepository, NewsWriteRepository>();
}

同时在表示层Program.cs中传入配置实例:

builder.Services.AddPersistenceServices(builder.Configuration);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:52:44