【问题标题】:Entity Framework: Recovered connectivity still yields 11001 error实体框架:恢复的连接仍然产生 11001 错误
【发布时间】:2013-10-24 22:32:23
【问题描述】:

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

我的测试场景:

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

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

有没有办法告诉 Entity Framework(或 ADO.NET)尝试重新打开连接?

更新:由于我使用的是 Entity Framework 6,我可以使用 SqlAzureExecutionStrategy 代替手动编码或企业库重试策略。

【问题讨论】:

  • 我认为创建DBContext 的新实例会重新创建连接。

标签: c# entity-framework ado.net database-connection


【解决方案1】:

我会这样做:

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);

【讨论】:

【解决方案2】:

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

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

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

也就是说,Bassam Alugili's answer 可能更可取,除非您通过重新初始化整个 dbcontext 获得其他东西。

【讨论】:

  • +1 有很多方法可以让他使用 Microsoft Enterprise 库的重试模式并结合您的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2021-11-01
  • 2016-11-17
相关资源
最近更新 更多