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

执行Add-Migration命令时遇Npgsql流读取超时异常求助

执行Add-Migration时出现Npgsql读取超时错误(Supabase PostgreSQL环境)

错误详情

Npgsql.NpgsqlException (0x80004005): Exception while reading from stream
 ---> System.TimeoutException: Timeout during reading attempt
   at Npgsql.Internal.NpgsqlReadBuffer.<Ensure>g__EnsureLong|54_0(NpgsqlReadBuffer buffer, Int32 count, Boolean async, Boolean readingNotifications)
   at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
   at Npgsql.Internal.NpgsqlConnector.ReadMessageLong(Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage)
   at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource<TResult>.GetResult(Int16 token)
   at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken)
   at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken)
   at Npgsql.NpgsqlDataReader.NextResult()
   at Npgsql.NpgsqlCommand.ExecuteReader(Boolean async, CommandBehavior behavior, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteReader(Boolean async, CommandBehavior behavior, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteScalar(Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteScalar()
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteScalar(RelationalCommandParameterObject parameterObject)
   at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists()
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Npgsql.EntityFrameworkCore.PostgreSQL.Migrations.Internal.NpgsqlMigrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String connectionString, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String connectionString, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)

数据库上下文代码

public sealed class ArchivesDbContext(DbContextOptions<ArchivesDbContext> options) 
    : DbContext(options), IUnitOfWork
{
    internal DbSet<Subject> Subjects { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema(Schemas.Archives);

        modelBuilder.ApplyConfiguration(new SubjectConfiguration());
    }
}

已尝试方案

  • 连接字符串中添加 Keepalive = 1 配置
  • 设置 CommandTimeOut = 60
    以上方案均无效,仍出现相同错误。

解决办法

针对Supabase PostgreSQL环境的这类超时问题,可尝试以下方案:

1. 调整连接字符串的超时参数

补充设置更长的超时阈值,示例连接字符串:

Host=your-supabase-host;Database=your-db;Username=your-user;Password=your-pass;Keepalive=10;Timeout=300;CommandTimeout=300
  • Timeout=300:设置连接建立超时为300秒
  • CommandTimeout=300:设置命令执行超时为300秒

2. 检查Supabase网络访问限制

  • 确认本地IP已添加到Supabase项目的IP访问列表(控制台「数据库」→「连接池」→「允许的IP地址」中配置)
  • 临时测试可开启「允许所有IP访问」(生产环境禁用此操作)

3. 配置正确的SSL连接参数

Supabase PostgreSQL强制要求SSL连接,确保连接字符串包含:

SSL Mode=Require;Trust Server Certificate=true

若需要指定根证书,可从Supabase控制台下载证书后添加参数:

Root Certificate=path/to/your/certificate.crt

4. 验证EF Core与Npgsql版本兼容性

确保Npgsql.EntityFrameworkCore.PostgreSQL版本与当前EF Core版本匹配,建议升级到双方最新稳定版,避免版本不兼容导致的通信问题。

5. 临时禁用连接池排查问题

在连接字符串中添加Pooling=false,排查是否为连接池复用导致的异常:

Pooling=false

若问题解决,再调整连接池参数(如Max Pool Size、Connection Idle Lifetime)而非长期禁用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:23:13