none
EntityFrameworkの内部で使用される接続文字列を取得したい。 RRS feed

  • 質問

  • ご質問させていただきます。
    掲題の通りなのですが、EntityFrameworkの内部で使用される接続文字列を取得する方法がわからずにいます。開発ではVisualStudio2010を使用しており、.NET4のアプリケーションを開発しています。

    Linq  to SQLの場合だと、たとえば

    using (AAADataContext aaa = new AAADataContext){
     string connectionString = aaa.Connection.ConnectionString;
    }
    

    のようなコードで内部で使われている実際の接続文字列を取得できます。

    同様にしてEntityFrameworkでも同じコードを書いてみたところ、

    using (AAAEntities aaa = new AAAEntities){
     string connectionString = aaa.Connection.ConnectionString;
    }
    

    この書き方ではapp.cofigに記載のNameプロパティの値しか取得することができず、SQLServerに接続するときに使われる実際の接続文字列が取得できません。
    アプリケーション実行時に、接続文字列の内容を取得したいのです。

    同じことをEntityFrameworkで行うには、どうすればよいのでしょうか?
    ざっと見た限りでは、そのようなプロパティが存在しないようなのですが・・・

    ご存知の方いらっしゃいましたら、ご教授お願いいたします。

    2010年7月24日 22:10

すべての返信

  • (試していませんが・・・)

    接続文字列の Name が取得できるなら、それと ConfigurationManager クラスを使って取得できないでしょうか?

    http://msdn.microsoft.com/ja-jp/library/system.configuration.configurationmanager(VS.80).aspx

     

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年7月24日 22:39
  • AAADataContext型はObjectContextの派生クラスで、ObjectContext.Connectionプロパティは宣言はDbConnection型となっていますが実際にはEntityConnection型です。
    で更にEntityConnection.StoreConnectionプロパティが実際のデーターベースへの接続を表すDbConnectionです。

    まとめると
    ((EntityConnection)aaa.Connection).StoreConnection.ConnectionString
    で取得できます。

    ただし、データーベースの接続先を変更したりしやすくすることを考えると、通常の(SqlConnection等、生の)ConnectionStringをapp.configに記述しておき、実行時にEntityConnectionStringBuilderを使ってConnectionStringを構築した方が便利なのではと考えています。

    2010年7月24日 22:58
  • 佐祐理様

    回答ありがとうございました。
    今すぐ試せる環境ではないですが、ご教授いただいたようにキャストして試してみます。
    なお、最初に書くべきでしたが、EntityFrameworkでの接続に用いられる接続文字列は動的に構築されるうえに、app.configにも記載されない仕組みとなっております。


    なかむら様

    回答ありがとうございました。
    先に記載の通り、app.configには接続文字列は記載されないのです。
    したがって実行時にオブジェクトのフィールドやプロパティを何らかの方法で読み取る方法を探しておりました。


    私のほうで引き続き頭を悩ませておりますが、リフレクションを用いてaaa インスタンスから(強引に)取得しようとも考えています。

    2010年7月27日 11:13