使用EF Core 6搭建PostgreSQL数据库时遭遇get_Settings()调用失败问题
开发基于C#的ASP.NET Core 6 Web API,使用Entity Framework Core 6搭建PostgreSQL数据库脚手架时执行以下命令报错:
dotnet ef dbcontext scaffold "Host=pi;Database=mydb;Username=root;Password=mypw" Npgsql.EntityFrameworkCore.PostgreSQL --project=myAPI --verbose
错误信息:
Attempt by method 'Npgsql.EntityFrameworkCore.PostgreSQL.Scaffolding.Internal.NpgsqlDatabaseModelFactory.PopulateGlobalDatabaseInfo(Npgsql.NpgsqlConnection, Microsoft.EntityFrameworkCore.Scaffolding.Metadata.DatabaseModel)' to access method 'Npgsql.NpgsqlConnection.get_Settings()' failed.
补充信息:
- 数据库部署在树莓派Docker容器中,使用最新PostgreSQL镜像,可通过本地Shell正常连接
- 已安装的NuGet包版本:
Microsoft.EntityFrameworkCore (6.0.22) Microsoft.EntityFrameworkCore.Design (6.0.22) Microsoft.EntityFrameworkCore.Tools (6.0.22) Npgsql.EntityFrameworkCore.PostgreSQL (6.0.22) Swashbuckle.AspNetCore (6.5.0)
- 手动创建DbContext后访问数据库仍出现相同错误;修改连接字符串密码会触发身份验证异常,说明连接本身可建立
这个错误是Npgsql核心库与Npgsql.EntityFrameworkCore.PostgreSQL版本不兼容导致的反射访问失败,按以下步骤排查修复:
统一Npgsql版本
检查项目是否直接安装了Npgsql包,确保其版本与Npgsql.EntityFrameworkCore.PostgreSQL完全一致(均为6.0.22)。若存在版本不一致的情况,卸载高版本Npgsql并安装匹配版本:dotnet remove package Npgsql dotnet add package Npgsql --version 6.0.22清理NuGet缓存
缓存损坏可能导致包版本匹配异常,执行以下命令清理所有NuGet本地缓存:dotnet nuget locals all --clear清理完成后,重新还原项目依赖:
dotnet restore验证项目目标框架
确认项目的目标框架为.NET 6(EF Core 6与.NET 6版本严格对应才能避免兼容性问题),可在项目文件(.csproj)中查看:<TargetFramework>net6.0</TargetFramework>重新生成并执行脚手架命令
重新生成解决方案后,再次运行脚手架命令:dotnet ef dbcontext scaffold "Host=pi;Database=mydb;Username=root;Password=mypw" Npgsql.EntityFrameworkCore.PostgreSQL --project=myAPI --verbose
内容的提问来源于stack exchange,提问作者Joe

