2

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

我的测试场景:

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

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

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

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

4

2 回答 2

2

我会这样做:

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

于 2013-10-24T13:29:08.330 回答
2

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

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

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

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

于 2013-10-24T13:34:06.647 回答