実行時に接続するデータベースを指定できるように、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="data source=testsvr;initial catalog=DEMO;persist security info=True;user id=sa;password=xxxxxxxx;MultipleActiveResultSets=True;App=EntityFramework"" 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年です!!! :-]
ご協力いただきありがとうございます!