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

C# 实体框架:恢复的连接仍产生11001个错误,c#,entity-framework,ado.net,database-connection,C#,Entity Framework,Ado.net,Database Connection,我正在使用实体框架和SQL Server进行一些错误恢复。我希望我的应用程序在恢复与数据库的连接后在后台重新加载信息 我的测试场景: 将我的机器置于飞行模式 启动应用程序;预期错误:(提供程序:TCP提供程序,错误:0-未知此类主机。) 应用程序将通过使用实体框架执行查询,每5秒重试一次连接 关闭飞行模式 10多次尝试后;仍然存在相同的错误:(提供程序:TCP提供程序,错误:0-不知道这样的主机。) 这让我相信,在连接恢复后,执行查询不会试图打开新的传输级别连接 有没有办法告诉EntityF

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

我的测试场景:

  • 将我的机器置于飞行模式
  • 启动应用程序;预期错误:(提供程序:TCP提供程序,错误:0-未知此类主机。)
  • 应用程序将通过使用实体框架执行查询,每5秒重试一次连接
  • 关闭飞行模式
  • 10多次尝试后;仍然存在相同的错误:(提供程序:TCP提供程序,错误:0-不知道这样的主机。)
这让我相信,在连接恢复后,执行查询不会试图打开新的传输级别连接

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


更新:因为我使用的是Entity Framework 6,所以我可以使用它来代替手工编码或企业库重试策略

我会这样做:

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;
    }
  }
}
private static void TryToConnect(DbContext DbContext,int connectionCounter)
{
//在ConnectionString中,可以设置连接超时=5000;或
//代码:
//var adapter=(IObjectContextAdapter)dbContext;
//var objectContext=adapter.objectContext;
//objectContext.CommandTimeout=5000;
尝试
{
dbContext.Database.Connection.Open();
}
捕获(例外情况除外)
{
如果(连接计数器<10)
{
TryToConnect(dbContext,connectionCounter++);
}
其他的
{
投掷;
}
}
}

从外部可以像这样调用它:
TryToConnect(myDbContext,0)

我会这样做:

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;
    }
  }
}
private static void TryToConnect(DbContext DbContext,int connectionCounter)
{
//在ConnectionString中,可以将连接超时设置为5000;或
//代码:
//var adapter=(IObjectContextAdapter)dbContext;
//var objectContext=adapter.objectContext;
//objectContext.CommandTimeout=5000;
尝试
{
dbContext.Database.Connection.Open();
}
捕获(例外情况除外)
{
如果(连接计数器<10)
{
TryToConnect(dbContext,connectionCounter++);
}
其他的
{
投掷;
}
}
}

从外部可以像这样调用它:
TryToConnect(myDbContext,0)

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

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

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

也就是说,这可能更可取,除非通过重新初始化整个dbcontext获得其他好处。

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

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

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

也就是说,可能更可取,除非您通过重新初始化整个dbcontext获得其他好处。

我认为创建
dbcontext
的新实例会重新创建连接。我认为创建
dbcontext
的新实例会重新创建连接。+1有很多方法,他也可以使用Microsoft Enterprise Library并与您的代码相结合。+1有很多方法,他也可以使用Microsoft Enterprise Library的重试模式并与您的代码相结合。@BasBrekelmans如果您想非常深入地进行此操作,请检查此链接:使用SqlAzureExecutionStrategy进行隔离,如我更新的问题。谢谢您的输入。@BasBrekelmans如果您想做得非常专业,请检查此链接:Doe使用SqlAzureExecutionStrategy保存它,如我更新的问题中所述。谢谢你的意见。