使用Npgsql.EntityFrameworkCore.PostgreSQL逆向工程时遇System.IO.EndOfStreamException
问题场景
执行EF Core数据库逆向工程命令时抛出流读取异常:
dotnet ef dbcontext scaffold "<connection string>" Npgsql.EntityFrameworkCore.PostgreSQL -v
完整异常信息:
Npgsql.NpgsqlException (0x80004005): Exception while reading from stream
---> System.IO.EndOfStreamException: Attempted to read past the end of the stream.
at Npgsql.Internal.NpgsqlReadBuffer.g__EnsureLong|41_0(NpgsqlReadBuffer buffer, Int32 count, Boolean async, Boolean readingNotifications)
at Npgsql.Internal.NpgsqlReadBuffer.g__EnsureLong|41_0(NpgsqlReadBuffer buffer, Int32 count, Boolean async, Boolean readingNotifications)
at Npgsql.Internal.NpgsqlConnector.RawOpen(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken, Boolean isFirstAttempt)
at Npgsql.Internal.NpgsqlConnector.g__OpenCore|191_1(NpgsqlConnector conn, SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken, Boolean isFirstAttempt)
at Npgsql.Internal.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
at Npgsql.ConnectorPool.OpenNewConnector(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
at Npgsql.ConnectorPool.g__RentAsync|28_0(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlConnection.g__OpenAsync|45_0(Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlConnection.Open()
at Npgsql.EntityFrameworkCore.PostgreSQL.Scaffolding.Internal.NpgsqlDatabaseModelFactory.Create(DbConnection dbConnection, DatabaseModelFactoryOptions options)
at Npgsql.EntityFrameworkCore.PostgreSQL.Scaffolding.Internal.NpgsqlDatabaseModelFactory.Create(String connectionString, DatabaseModelFactoryOptions options)
at Microsoft.EntityFrameworkCore.Scaffolding.Internal.ReverseEngineerScaffolder.ScaffoldModel(String connectionString, DatabaseModelFactoryOptions databaseOptions, ModelReverseEngineerOptions modelOptions, ModelCodeGenerationOptions codeOptions)
at Microsoft.EntityFrameworkCore.Design.Internal.DatabaseOperations.ScaffoldContext(String provider, String connectionString, String outputDir, String outputContextDir, String dbContextClassName, IEnumerable1 schemas, IEnumerable1 tables, String modelNamespace, String contextNamespace, Boolean useDataAnnotations, Boolean overwriteFiles, Boolean useDatabaseNames, Boolean suppressOnConfiguring, Boolean noPluralize)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScaffoldContextImpl(String provider, String connectionString, String outputDir, String outputDbContextDir, String dbContextClassName, IEnumerable1 schemaFilters, IEnumerable1 tableFilters, String modelNamespace, String contextNamespace, Boolean useDataAnnotations, Boolean overwriteFiles, Boolean useDatabaseNames, Boolean suppressOnConfiguring, Boolean noPluarlize)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScaffoldContext.<>c__DisplayClass0_0.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
使用包版本:Npgsql.EntityFrameworkCore.PostgreSQL 6.0.7
可行解决方案
1. 调整连接字符串的SSL配置
该异常多与SSL连接冲突相关,尝试修改连接字符串中的SslMode参数:
- 若数据库无需SSL,显式关闭:
SslMode=Disable - 若需要SSL但证书验证异常,添加信任配置:
SslMode=Require;Trust Server Certificate=true
2. 升级Npgsql包到兼容补丁版
6.0.7版本存在已知连接稳定性问题,建议升级到同主版本的最新补丁(如6.0.22,.NET 6 LTS适配版):
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL --version 6.0.22
3. 验证数据库服务器连通性
- 确认PostgreSQL服务正常运行,默认端口5432未被防火墙/安全组拦截
- 使用psql工具直接测试连接,排除网络问题:
psql "host=<你的服务器地址> port=5432 dbname=<数据库名> user=<用户名> password=<密码>"
4. 增加连接超时参数
在连接字符串中添加超时配置,避免网络延迟导致连接中断:
Timeout=30;CommandTimeout=30
5. 检查数据库连接数上限
若服务器连接数已满,会导致新连接被异常终止,登录数据库执行以下命令排查:
SHOW max_connections; SELECT count(*) FROM pg_stat_activity;
若连接数接近上限,需调整服务器配置或关闭闲置连接。
内容的提问来源于stack exchange,提问作者Vinyl Warmth

