2012-04-20 24 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

お世話になりました、ありがとうございます。私は記事「Code First:Inside DbContext Initialization」を赤色にしていますが、残念なことに私の問題を解決する方法については何の情報も得ていません; – CodeCannibal

関連する問題