2012-04-20 82 views
0

我想產生一個小代碼,檢查,然後我的SQL服務器是可連接的。如果是這樣,那麼它應該檢查數據庫是否存在。 讓我通過代碼來解釋它。實體框架代碼第一次連接狀態檢查

這是我的主方法:

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

你可以想像:有我的本地SQL服務器「SQLEXPRESS」上的現有數據庫「sqltest語句」。 但是:沒有像'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,EXISTING,NO_CONNECTION」。

就是這樣!我不知道背景中發生了什麼以及如何控制。

發生了什麼,我該如何解決這個問題?

回答

0

這是一種預期的行爲,我認爲(至少部分)的,據我瞭解(和短的進入反射器)

在此詳盡的解釋看一看的DbContext如何初始化, Code First: Inside DbContext Initialization

簡化了一點 - DbContext不會爲每個new DbContext重新創建東西。在裏面,EDM(實體數據模型)和其他一些東西('真實的'ObjectContext實例)被緩存爲AppDomain

在這種特殊情況下,第一次調用什麼都不做,它無法定位服務器,也沒有「可行的」選擇 - 所以它只是出錯 - 而且你會得到「無連接」。

在下一個階段,它成功並初始化了其中的一些數據(AppDomain是'全局' - 在大多數情況下意味着您的應用程序) - 'new DbContext'幾乎沒有任何作用,但在首次使用時,在你的情況下,'Exists'它不會創建Db,但會進行一些初始化(看似)。

並在最後一遍,它試圖打開一個連接,失敗 - 但它已經有一個有效的連接,可以從它已經初始化的數據重用。

唯一的問題是爲什麼它會'繼續'失敗的連接嘗試和重用舊的(因爲它是一個明確的調用),我沒有答案 - 但它看起來是這樣的(和這是內部實現 - 或者是一個錯誤?)。

+0

嘿,那裏,謝謝你的幫助。我將文章「代碼優先:內部DbContext初始化」 - 但不幸的是我沒有得到如何解決我的問題的信息;)任何人在這裏誰可以給我一些其他的提示? – CodeCannibal 2012-04-23 06:57:28