2012-04-20 4 views
0

Я пытаюсь создать небольшой код, который проверяет, что мой SQL-сервер подключается. И: если да, то он должен проверить, существует ли база данных. Позвольте мне объяснить это с помощью кода.Проверка статуса первого соединения Framework Entity Framework

Это мой главный-метод:

private static void Main(string[] args) 
     { 
      Database.SetInitializer<MyDbContext>(new DropCreateDatabaseAlways<MyDbContext>()); 
      Console.WriteLine(CheckIfDatabaseExists("Data Source=127.0.0.1\\SQLEXPRESS2;Initial Catalog=SQLTest;Integrated Security=True;Connect Timeout=3")); 
      Console.WriteLine(CheckIfDatabaseExists("Data Source=127.0.0.1\\SQLEXPRESS;Initial Catalog=SQLTest;Integrated Security=True;Connect Timeout=3")); 
      Console.WriteLine(CheckIfDatabaseExists("Data Source=127.0.0.1\\SQLEXPRESS2;Initial Catalog=SQLTest;Integrated Security=True;Connect Timeout=3")); 
     } 

Как вы можете себе представить: есть существующая база данных «SQLTest» на моем локальном сервере SQL 'SQLEXPRESS. Но: нет такого сервера, как «SQLEXPRESS2»!

Хорошо - больше кода. А вот мой метод проверки:

public static DatabaseExistsStatus CheckIfDatabaseExists(String connString) 
     { 
      try 
      { 

       using (var db = new MyDbContext(connString)) 
       { 
        bool DbExists = db.Database.Exists(); 
        if (DbExists) 
        { 
         // database is existing 
         return DatabaseExistsStatus.EXISTING; 
        } 
        else 
        { 
         // config is working, but database does not exist 
         return DatabaseExistsStatus.NO_DB; 
        } 
       } 
      } 
      catch (Exception) 
      { 
       // no working config 
       return DatabaseExistsStatus.NO_CONNECTION; 
      } 
     } 

     public enum DatabaseExistsStatus 
     { 
      EXISTING, 
      NO_CONNECTION, 
      NO_DB 
     } 

Начиная мое приложение приносит следующий результат:

NO_CONNECTION 
EXISTING 
NO_DB 

я запутался! Я ожидал «NO_CONNECTION, СУЩЕСТВУЮЩИЙ, NO_CONNECTION».

И все, я не знаю, что происходит в фоновом режиме и как получить контроль.

Что происходит там и как я могу это исправить?

ответ

0

Это своего рода ожидаемое поведение я считаю (по крайней мере частично), насколько я понимаю (и короткий идти в рефлектор)

Взгляните на этом тщательное объяснение, как DbContext инициализируется, Code First: Inside DbContext Initialization

Упрощенный бит - DbContext не воссоздает вещи для каждого new DbContext. Внутри EDM (модель данных сущности) и некоторые другие вещи («реальный» экземпляр ObjectContext) кэшируются для AppDomain.

В этом конкретном случае первый вызов ничего не делает, ему не удается найти сервер и не существует «жизнеспособной» альтернативы - так что это просто ошибки - и вы получаете «нет связи».

На следующем проходе он успешно завершает и инициализирует некоторые из данных внутри (что является «глобальным» для AppDomain, что означает ваше приложение в большинстве случаев) - сам «new DbContext» практически ничего не делает, но при первом использовании, в вашем случае «Exists» он не создает Db, а выполняет некоторую инициализацию (по-видимому).

И на последнем проходе он пытается открыть соединение, не работает - НО он уже имеет действительное соединение, которое может быть повторно использовано из уже инициализированных данных, которые у него есть.

Вопрос только в том, почему он «продолжит» попытку подключения «неудачно» и повторно использует старый (поскольку это явный вызов), у меня нет ответа на этот вопрос, но это то, что он делает (кажется, это внутренняя реализация - или ошибка?).

+0

Эй, спасибо, за вашу помощь. Я краю статью «Code First: Inside DbContext Initialization» - но, к сожалению, я не получаю никакой информации о том, как исправить мою проблему;) Кто-нибудь здесь, кто мог бы дать мне другие советы? – CodeCannibal

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