エンティティフレームワークオブジェクトが1つあり、それをプロジェクトに追加すると、connectionstring
がconnectionstring
セクションのapp.config
に追加されますが、新しいentitycontext
を作成してこのconnectionstring
を使用すると、このエラーが表示されます
ソリューションに複数のプロジェクトがあり、edmx
ファイルを含むエンティティフレームワークを含むプロジェクトがソリューションのスタートアッププロジェクトではないという事実が原因であると思われます。この場合、接続文字列がEF app.config
プロジェクトに存在していても、CLRは実行時にそれを見つけることができません。たとえば、ソリューションにWebサイトとEFプロジェクトがある場合、EFプロジェクトのapp.config
からWebサイトのweb.config
に接続文字列をコピーする必要があります。基本的に、接続文字列データは、.NetスレッドがCLRによって開始されたプロジェクト(つまり、スタートアッププロジェクト)の構成ファイルに存在する必要があります。そうでない場合は、edmx
ファイルを開き、その表面を右クリックしてプロパティを選択し、接続文字列をコピーして、app.config
接続文字列セクションに貼り付けます。これにより、設定に正しいものが含まれていることを確認できます。
EDIT:
ここで ObjectContext Constructor のドキュメントにあるように、最初のパラメーターは接続文字列名ですEDMの作成時に生成されたコード。接続文字列名の名前が変更された場合、モデルを右クリックして「データベースからモデルを更新...」を選択するだけです。ウィザードに従って、この変更を反映するように設定およびデザイナーを更新します。
App.configの接続文字列をweb.configにコピーするか、ファイル全体を出力を表示するプロジェクトにコピーする必要があります。フレームワークを消費する条件の1つです。
ソリューションの複数のプロジェクトで使用されるカスタムデータベースロジックを.dllに配置しようとしたときに、この問題に遭遇しました。
.dllには正しいapp.configファイルがありますが、機能しませんでした。エンティティフレームワークでは、.exeのapp.configに接続情報が必要でした。そこへの情報のコピーはうまくいきました。
接続文字列を.edmxに直接貼り付けるというMortezaのソリューションは、値を貼り付けられないため、うまくいきませんでした。
これにはバリエーションがあり、誰もカバーしていないようです。
いくつかのモデルを持つメインプロジェクトと、単体テストを含むテストプロジェクトがありました。テストプロジェクトは機能していましたが、OPに記載されているエラーで停止しました。 EDMXファイルの名前変更や移動は行っていません。
.configファイルの比較について多くのアドバイスがありましたが、私のプロジェクトにはまったく何もありませんでした。
最終的に、app.configファイルをメインプロジェクトからテストプロジェクトにコピーし、それが機能しました。これが正しい手順であるか、または追加のモデルが追加されたときに保守性の問題が発生するかどうかはわかりませんが、少なくともユニットテストは現在正しく実行されています。
こんにちは、私はこの問題を抱えていました。とにかく、私は最終的に問題が何であるかを理解しました。最初にしなければならないことは、app.config
とweb.config
のconnectionstrings
が同じであることを確認することです。次に、.edmx
ファイルをダブルクリックして、テーブルを表示する必要があります。テーブルの近くではなくテーブルの近くをクリックして、プロパティに移動します。ドロップダウンリストからConceptualEntityModel
を選択し、エンティティコンテナ名を検索して覚えておいてください。
次に、edmxファイルのデザイナーに移動して、コンストラクターを開きます。 (デザイナーはedmxファイルのサブフォルダーです)コンストラクターのBASEパラメーターには2つのパラメーターが必要です
public DBEntities() : base("name=DBEntities", "DBEntities")
{
this.ContextOptions.LazyLoadingEnabled = true;
OnContextCreated();
}
これはそれらの1つです。最初のパラメーターには、.edmx
ファイルが含まれるプロジェクトファイルの名前を指定する必要があります。2番目のパラメーターには、前述のプロパティのエンティティコンテナー名を指定する必要があります。 base("", "")
を使用して、すべてのコンストラクタを配置することを忘れないでください
少なくともそれが私の問題であり、私の問題はそのように解決されました。私はあなたがこのようにあなたを解決できることを願っています。
Morteza Manavi 'answer はこの問題を解決しますが、別の解決策は接続文字列を動的に構築し、ObjectContextのコンストラクターに渡すことです。
public static string CreateConnectionString()
{
var assemblyPath = Assembly.GetExecutingAssembly().Location;
string assemblyLocation = Path.GetDirectoryName(assemblyPath);
string dbPath = Path.Combine(assemblyLocation, "YourDatabase.sdf");
var sqlBuilder = new SqlConnectionStringBuilder { DataSource = dbPath };
var entityBuilder = new EntityConnectionStringBuilder
{
ProviderConnectionString = sqlBuilder.ConnectionString,
Provider = "System.Data.SqlServerCe.3.5",
Metadata = @"res://*/YourModel.csdl|
res://*/YourModel.ssdl|
res://*/YourModel.msl"
};
return entityBuilder.ToString();
}
// Snip...
var entityContext = new YourObjectContext(CreateConnectionString());
これにより、接続文字列情報を、少なくとも私の場合は望ましくないスタートアッププロジェクトのapp.configにコピーする必要がなくなります。
接続文字列の属性としてproviderName = "System.Data.EntityClient"を追加するのを忘れました。その結果、このエラーが発生しました
<add name="connectionName" connectionString="metadata=res://*/..." providerName="System.Data.EntityClient" />
の代わりに
<add name="connectionName" connectionString="metadata=res://*/..." />
アプリがVS2010のIISで作成された場合、Webサイトルートの2つのレベルでこのエラーが発生することがわかりました。なぜそれが起こるのかわからないので、さらに調査する必要があります。たとえば、アプリが/admin/advertiser
パスにある場合、IISサイトに/admin
仮想ディレクトリがない場合、エラーが表示されます。
私がしたことは、.../intepub/wwwroot
エラーが消えた空のadmin
ディレクトリを作成することだけです。
上記の手順を実行するまで、デバッグを開始できないことがわかります。
私たちは過去にこの問題をチームに抱えていました。覚えるのに時間がかかりましたが、これも以前の修正方法でした。
私はn'tierアーキテクチャを使用していますが、同じ問題が発生しましたが、これが助けになります。最初に、同じconnection string
がlibraries
あり、app.config
やweb.config
のようにDBにアクセスできます。その後、単に.edmx(Model.contextにオーバーロードされたコンストラクターを追加します。 cs)コンストラクターが2つになったファイルは1つがデフォルトで、もう1つは追加したばかりです(オーバーロード)。
public YourEntityName(string connString)
: base(connString)
{
}
EFでも動作したくないクラスライブラリがありました。 app.config(または単に接続文字列セクション)をクラスライブラリからexeプロジェクトにコピーした後、接続は正常に機能しました!おそらく、構成ファイルはexeプロジェクトと同じフォルダーにあると予想されるため、見つかりませんでした。したがって、クラスライブラリプロジェクトで構成ファイルが使用されている場合は、常に特別な注意が必要です。