实体框架:恢复的连接仍会产生 11001 错误

本文关键字:11001 错误 连接 框架 恢复 实体 | 更新日期: 2023-09-27 18:36:53

我正在使用实体框架和SQL Server进行一些错误恢复。我希望我的应用程序在恢复与数据库的连接后在后台重新加载信息。

我的测试场景:

  • 将我的机器置于飞行模式
  • 启动应用程序;预期错误:(提供程序:TCP 提供程序,错误:0 - 未知此类主机。
  • 应用程序将使用实体框架执行查询,每 5 秒重试连接一次
  • 关闭飞行模式
  • 10+ 次尝试后;相同的错误仍然存在:(提供程序:TCP 提供程序,错误:0 - 不知道此类主机。

这让我相信执行查询不会在连接恢复后尝试打开新的传输级别连接。

有没有办法告诉实体框架(或 ADO.NET)尝试重新打开连接?

更新:由于我使用的是实体框架 6,因此我可以使用 SqlAzureExecutionStrategy 而不是手动编码或企业库重试策略。

实体框架:恢复的连接仍会产生 11001 错误

我会这样做:

private static void TryToConnect(DbContext dbContext, int connectionCounter)
{
  // in ConnectionString you can set the Connect Timeout = 5000; OR
  // IN CODE:
  // var adapter = (IObjectContextAdapter)dbContext;
  // var objectContext = adapter.ObjectContext;
  // objectContext.CommandTimeout = 5000;
  try
  {
    dbContext.Database.Connection.Open();
  }
  catch (Exception ex)
  {
    if (connectionCounter < 10)
    {
      TryToConnect(dbContext, connectionCounter++);
    }
    else
    {
      throw;
    }
  }
}

从外面你可以这样称呼它:TryToConnect(myDbContext, 0);

您需要做的就是重新实例化您的DBContext。不确定这是否适用于你的方案。我已经对此进行了测试,并按预期重新创建了连接。

查看DBContext的源代码,我们可以看到重新实例化对象确实会重新创建连接:

protected DbContext()
{
    this.InitializeLazyInternalContext(new LazyInternalConnection(this.GetType().DatabaseName()), null);
}

也就是说,Bassam Alugili的答案可能更可取,除非你通过重新初始化整个dbcontext来获得其他东西。