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

.NET Core 3 Preview迁移EF PostgreSQL时DI报错求助

解决EF Core 3.0 Preview迁移时的服务解析错误

这个错误的核心原因是EF Core与Npgsql EF Core Provider版本不兼容,再加上Startup中EF服务注册的写法有误,导致DI容器无法正确解析EF查询所需的服务。下面是具体的解决步骤:

1. 对齐EF Core与Npgsql Provider的版本

你当前使用的Microsoft.EntityFrameworkCore是preview6版本,但Npgsql.EntityFrameworkCore.PostgreSQL还是preview5版本——这两个版本的内部依赖接口(比如IEntityQueryableTranslatorFactory)已经发生了变化,版本不匹配会直接导致服务无法解析。

解决方法:将Npgsql.EntityFrameworkCore.PostgreSQL升级到与EF Core完全一致的版本:

Install-Package Npgsql.EntityFrameworkCore.PostgreSQL -Version 3.0.0-preview6.19304.10

或者通过NuGet包管理器手动更新到对应版本。

2. 修正Startup中EF服务的注册方式

你当前的写法存在两个问题:

  • 手动调用BuildServiceProvider()会创建一个独立的服务容器,和ASP.NET Core主DI容器不共享,导致仓储类中注入的MyContext无法访问正确的EF服务。
  • 没有正确配置Npgsql的数据库连接字符串。

修改ConfigureServices中的EF注册代码:

// 替换原来的AddEntityFrameworkNpgsql().AddDbContext().BuildServiceProvider()
services.AddDbContext<MyContext>(options =>
    // 这里替换成你的连接字符串配置,比如从appsettings.json中读取
    options.UseNpgsql(_config.GetConnectionString("PostgresConnection")));

同时删除services.AddEntityFrameworkNpgsql()这一行——AddDbContext结合UseNpgsql已经会自动注册所需的EF服务。

3. 验证仓储类与上下文的注入

你的仓储类代码本身没有问题,确保MyContext的定义是正确的,比如继承自DbContext并正确配置DbSet<MyEntity> Some:

public class MyContext : DbContext
{
    public MyContext(DbContextOptions<MyContext> options) : base(options)
    {
    }

    public DbSet<MyEntity> Some { get; set; }
}

完成以上修改后,重新编译并运行项目,ToListAsync()的调用应该就能正常工作了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:41:27