web-dev-qa-db-ja.com

指定された名前付き接続が構成に見つからないか、EntityClientプロバイダーで使用することを意図していないか、無効です

エンティティフレームワークオブジェクトが1つあり、それをプロジェクトに追加すると、connectionstringconnectionstringセクションのapp.configに追加されますが、新しいentitycontextを作成してこのconnectionstringを使用すると、このエラーが表示されます

166
user421413

ソリューションに複数のプロジェクトがあり、edmxファイルを含むエンティティフレームワークを含むプロジェクトがソリューションのスタートアッププロジェクトではないという事実が原因であると思われます。この場合、接続文字列がEF app.configプロジェクトに存在していても、CLRは実行時にそれを見つけることができません。たとえば、ソリューションにWebサイトとEFプロジェクトがある場合、EFプロジェクトのapp.configからWebサイトのweb.configに接続文字列をコピーする必要があります。基本的に、接続文字列データは、.NetスレッドがCLRによって開始されたプロジェクト(つまり、スタートアッププロジェクト)の構成ファイルに存在する必要があります。そうでない場合は、edmxファイルを開き、その表面を右クリックしてプロパティを選択し、接続文字列をコピーして、app.config接続文字列セクションに貼り付けます。これにより、設定に正しいものが含まれていることを確認できます。

EDIT:
ここで ObjectContext Constructor のドキュメントにあるように、最初のパラメーターは接続文字列名ですEDMの作成時に生成されたコード。接続文字列名の名前が変更された場合、モデルを右クリックして「データベースからモデルを更新...」を選択するだけです。ウィザードに従って、この変更を反映するように設定およびデザイナーを更新します。

216
Morteza Manavi

App.configの接続文字列をweb.configにコピーするか、ファイル全体を出力を表示するプロジェクトにコピーする必要があります。フレームワークを消費する条件の1つです。

31
Musikero31

ソリューションの複数のプロジェクトで使用されるカスタムデータベースロジックを.dllに配置しようとしたときに、この問題に遭遇しました。

.dllには正しいapp.configファイルがありますが、機能しませんでした。エンティティフレームワークでは、.exeのapp.configに接続情報が必要でした。そこへの情報のコピーはうまくいきました。

接続文字列を.edmxに直接貼り付けるというMortezaのソリューションは、値を貼り付けられないため、うまくいきませんでした。

9

これにはバリエーションがあり、誰もカバーしていないようです。

いくつかのモデルを持つメインプロジェクトと、単体テストを含むテストプロジェクトがありました。テストプロジェクトは機能していましたが、OPに記載されているエラーで停止しました。 EDMXファイルの名前変更や移動は行っていません。

.configファイルの比較について多くのアドバイスがありましたが、私のプロジェクトにはまったく何もありませんでした。

最終的に、app.configファイルをメインプロジェクトからテストプロジェクトにコピーし、それが機能しました。これが正しい手順であるか、または追加のモデルが追加されたときに保守性の問題が発生するかどうかはわかりませんが、少なくともユニットテストは現在正しく実行されています。

6
S. Baggy

こんにちは、私はこの問題を抱えていました。とにかく、私は最終的に問題が何であるかを理解しました。最初にしなければならないことは、app.configweb.configconnectionstringsが同じであることを確認することです。次に、.edmxファイルをダブルクリックして、テーブルを表示する必要があります。テーブルの近くではなくテーブルの近くをクリックして、プロパティに移動します。ドロップダウンリストからConceptualEntityModelを選択し、エンティティコンテナ名を検索して覚えておいてください。

次に、edmxファイルのデザイナーに移動して、コンストラクターを開きます。 (デザイナーはedmxファイルのサブフォルダーです)コンストラクターのBASEパラメーターには2つのパラメーターが必要です

public DBEntities() : base("name=DBEntities", "DBEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

これはそれらの1つです。最初のパラメーターには、.edmxファイルが含まれるプロジェクトファイルの名前を指定する必要があります。2番目のパラメーターには、前述のプロパティのエンティティコンテナー名を指定する必要があります。 base("", "")を使用して、すべてのコンストラクタを配置することを忘れないでください

少なくともそれが私の問題であり、私の問題はそのように解決されました。私はあなたがこのようにあなたを解決できることを願っています。

6
MaltaCoders

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にコピーする必要がなくなります。

4
Nick Spreitzer

接続文字列の属性としてproviderName = "System.Data.EntityClient"を追加するのを忘れました。その結果、このエラーが発生しました

<add name="connectionName" connectionString="metadata=res://*/..." providerName="System.Data.EntityClient" />

の代わりに

<add name="connectionName" connectionString="metadata=res://*/..." />
4
Gertjan

アプリがVS2010のIISで作成された場合、Webサイトルートの2つのレベルでこのエラーが発生することがわかりました。なぜそれが起こるのかわからないので、さらに調査する必要があります。たとえば、アプリが/admin/advertiserパスにある場合、IISサイトに/admin仮想ディレクトリがない場合、エラーが表示されます。

私がしたことは、.../intepub/wwwrootエラーが消えた空のadminディレクトリを作成することだけです。

上記の手順を実行するまで、デバッグを開始できないことがわかります。

私たちは過去にこの問題をチームに抱えていました。覚えるのに時間がかかりましたが、これも以前の修正方法でした。

2
Jovica Zaric

私はn'tierアーキテクチャを使用していますが、同じ問題が発生しましたが、これが助けになります。最初に、同じconnection stringlibrariesあり、app.configweb.configのようにDBにアクセスできます。その後、単に.edmx(Model.contextにオーバーロードされたコンストラクターを追加します。 cs)コンストラクターが2つになったファイルは1つがデフォルトで、もう1つは追加したばかりです(オーバーロード)。

        public YourEntityName(string connString)
            : base(connString)
        {
        }
1
Hafiz Asad

EFでも動作したくないクラスライブラリがありました。 app.config(または単に接続文字列セクション)をクラスライブラリからexeプロジェクトにコピーした後、接続は正常に機能しました!おそらく、構成ファイルはexeプロジェクトと同じフォルダーにあると予想されるため、見つかりませんでした。したがって、クラスライブラリプロジェクトで構成ファイルが使用されている場合は、常に特別な注意が必要です。

1
Vincent