.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
相关产品推荐
相关产品推荐

