C# 实体框架:恢复的连接仍产生11001个错误
我正在使用实体框架和SQL Server进行一些错误恢复。我希望我的应用程序在恢复与数据库的连接后在后台重新加载信息 我的测试场景: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
- 将我的机器置于飞行模式
- 启动应用程序;预期错误:(提供程序:TCP提供程序,错误:0-未知此类主机。)
- 应用程序将通过使用实体框架执行查询,每5秒重试一次连接
- 关闭飞行模式
- 10多次尝试后;仍然存在相同的错误:(提供程序:TCP提供程序,错误:0-不知道这样的主机。)
更新:因为我使用的是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保存它,如我更新的问题中所述。谢谢你的意见。