2

実行時に接続するデータベースを指定できるように、EF 駆動のデータベース ファースト ASP.NET MVC4 Web アプリケーションを変更したいと考えています。最初は、web.configのconnectionStringsセクションのエントリをコード化されたバージョンに置き換えたかっただけです。しかし、まず最初に。これが私のweb.config接続セクションです:

  <connectionStrings>
    <add name="WEB_Entities" connectionString="metadata=~/bin/Models\WEB_Models.csdl|~/bin/Models\WEB_Models.ssdl|~/bin/Models\WEB_Models.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=testsvr;initial catalog=DEMO;persist security info=True;user id=sa;password=xxxxxxxx;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

この設定を使用すると、すべてが正常に実行されます。ここで、このエントリをコメントアウトしてハードコーディングし、設定を web.config から global.asax.cs に移動しようとしました。

EntityConnectionStringBuilderについて読みましたが、最初は接続文字列全体を EntityConnection のコンストラクターパラメーターとして指定したいだけです。

    string CS =
    @"metadata=~/bin/Models\WEB_Models.csdl|
    ~/bin/Models\WEB_Models.ssdl|
    ~/bin/Models\WEB_Models.msl;
    provider=System.Data.SqlClient;
    provider connection string=""Data Source=testsvr\sqlexpress;
    Initial Catalog=DEMO;
    Integrated Security=True;MultipleActiveResultSets=True""";

    conn = new EntityConnection(CS);
    conn.Open();

conn オブジェクトは、アプリケーション クラスに存在する静的オブジェクトです。

public static EntityConnection conn;

この接続オブジェクトを使用するために、web.config のエントリの名前ではなく、前述の接続オブジェクトをコンストラクター パラメーターとして使用するように DBContext コードを変更しました。

public partial class WEB_Entities : DbContext
{
    public WEB_Entities()
        : base(PAMVCTEST.MvcApplication.conn,true)
        //: base("name=WEB_Entities")
    {
    }

全体を実行してコンパイルすると、db サーバーへの接続は可能であるように見えます (たとえば、データソースを何か間違ったものに変更したときにネットワーク関連のエラーが発生するため) が、アプリケーションは指定されたメタデータ ファイルを見つけられません。これはエラーです:

The supplied connection string is not valid, because it contains insufficient mapping or metadata information. Parameter name: connection

メタデータ ファイルが見つからない理由がわかりません。指定された場所に確実に存在します。すべてを web.config 接続エントリの使用に戻すとすぐに、すべてが期待どおりに機能します。

また、メタデータ ファイルの場所を次のように変更してみました。

res://*/Models.WEB_Models.csdl|res://*/Models.WEB_Models.ssdl|res://*/Models.WEB_Models.msl

ILMerge でリソース名が正しいことを確認しました。結果は同じです。web.configの方法を使用すると動作します。コードで設定すると、上記と同じエラーが発生します。

この問題を解決するにはどうすればよいですか? 回避策はありますか? そして、なぜ世界で、ネストされたエスケープなどを使用して、このようなひどくエラーが発生しやすい接続文字列に対処する必要があるのでしょうか? 2013年です!!! :-]

ご協力いただきありがとうございます!

4

1 に答える 1