2013-10-24 3 views
2

Я делаю некоторое восстановление ошибок с помощью Entity Framework и SQL Server. Я хочу, чтобы мое приложение перезагрузило информацию в фоновом режиме после восстановления связи с базой данных.Entity Framework: восстановленная связь все еще дает ошибку 11001

Мой тестовый сценарий:

  • поставил свою машину в режиме полета
  • запуска приложения; Ожидается, ошибка: (поставщик: поставщик TCP, ошибка: 0 - Нет такого хоста не известно.)
  • приложение будет пытаться повторить подключение через каждые 5 секунд, выполнив запрос с использованием фреймворка Entity
  • выключить режим полета
  • после 10 + попытки; такая же ошибка сохраняется: (поставщик: поставщик TCP, ошибка: 0 - такой хост не известен.)

Это убеждает меня в том, что выполнение запроса не будет пытаться открыть новое соединение уровня транспортного уровня после того, восстановлены.

Есть ли способ сообщить Entity Framework (или ADO.NET), чтобы попытаться повторно открыть соединение?

Обновление: Поскольку я использую Entity Framework 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 Если вы хотите сделать это очень профессионально, проверьте эту ссылку: 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 есть много способов, чтобы он мог просто использовать шаблон Retry из библиотеки Microsoft Enterprise и в сочетании с вашим кодом. –

Смежные вопросы