实体框架:恢复的连接仍会产生 11001 错误
本文关键字:11001 错误 连接 框架 恢复 实体 | 更新日期: 2023-09-27 18:36:53
我正在使用实体框架和SQL Server进行一些错误恢复。我希望我的应用程序在恢复与数据库的连接后在后台重新加载信息。
我的测试场景:
- 将我的机器置于飞行模式
- 启动应用程序;预期错误:(提供程序:TCP 提供程序,错误:0 - 未知此类主机。
- 应用程序将使用实体框架执行查询,每 5 秒重试连接一次
- 关闭飞行模式
- 10+ 次尝试后;相同的错误仍然存在:(提供程序:TCP 提供程序,错误:0 - 不知道此类主机。
这让我相信执行查询不会在连接恢复后尝试打开新的传输级别连接。
有没有办法告诉实体框架(或 ADO.NET)尝试重新打开连接?
更新:由于我使用的是实体框架 6,因此我可以使用 SqlAzureExecutionStrategy 而不是手动编码或企业库重试策略。
我会这样做:
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来获得其他东西。