2013-10-24 33 views
2

我正在使用實體框架和SQL Server進行一些錯誤恢復。我希望我的應用程序在與數據庫的連接恢復後在後臺重新加載信息。實體框架:恢復的連接仍然會產生11001錯誤

我的測試場景:

  • 把我的機器在飛行模式
  • 啓動應用程序;預期的錯誤:(provider:TCP提供,錯誤:0 - 沒有這樣的宿主是已知的。)
  • 應用將重試通過使用實體框架
  • 關閉飛行模式
  • 執行查詢每5秒連接後10 +嘗試; (提供商:TCP提供商,錯誤:0 - 沒有這樣的主機是已知的。)

這說服我相信執行查詢不會試圖打開一個新的傳輸級別連接後,連接已經恢復。

有什麼辦法可以告訴實體框架(或ADO.NET)嘗試重新打開連接嗎?

更新:由於我使用實體框架6,我可以使用SqlAzureExecutionStrategy而不是手動編碼或企業庫重試策略。

+0

我想創建一個新的'DBContext'實例會重新創建連接。 – Mansfield

回答

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

+1

@BasBrekelmans如果你願意這樣做非常proffesional檢查此鏈接:http://msdn.microsoft.com/en-us/library/hh680905(v = pandp.50).aspx Doei –

+1

解決它使用SqlAzureExecutionStrategy解釋在我更新的問題。謝謝您的意見。 – Bas

2

所有你應該需要做的是重新實例化DBContext。不知道這是否適合您的情況。我已經測試過了,連接按照預期重新創建。

看着爲DBContext的源代碼,我們可以看到,重新實例化對象並重新創建連接:

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

這就是說,Bassam Alugili's answer可能是最好的,除非你得到其他的東西通過重初始化整個dbcontext。

+0

+1有很多方法可以使用Microsoft企業庫中的重試模式,並結合代碼。 –