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


170

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



4
リンクをありがとう、クレイグ。ただし、タイトルがMetadataExceptionエラーを見つけるのに役立ったため、このスレッドを維持するように投票しました。
jp2code、2011年

これは、奇妙な理由で構成ファイルが接続文字列で更新されなかったときに起こりました。
P.Brian.Mackey

回答:


217

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

編集: ObjectContext ConstructorのDocumenationで
確認できるよう に、最初のパラメーターは、EDMの作成時に生成されたコードである接続文字列名です。どういうわけか、接続 文字列の名前が変更された場合は、モデルを右クリックして[ データベースからモデルを更新... ]を選択するだけです。ウィザードに従って、設定とデザイナーを更新し、これを反映します。変化する。


1
こんにちはMortezaとあなたの答えに感謝しますが、以前はweb.configに接続文字列のセクチンをコピーしましたが、エラーは解決されませんが、entitymodel.designerで(public EntityContext():base( "name = EntityContext"、EntityContext " ))これが機能した接続
文字列

1
@Morteza、実行中のアセンブリにapp.configがないプロジェクトの解決策はありますか?私の場合、呼び出し元の実行可能ファイルは、COM相互運用機能を介して(エンティティオブジェクトが存在する)アセンブリを呼び出すVB6アプリです。
生鮮デーブ

4
とてもシンプルでいらいらします。投票する。長いライブスタックオーバーフロー!
granadaCoder

3
WCFを使用している場合は、サービスプロジェクトに接続文字列を含めることを忘れないでください
Nathan

1
モルテザに感謝します。
クリス・

32

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


1
同じ接続文字列(データアクセスプロジェクトと同様)をweb.config(フロントエンドプロジェクトにあります)に追加するだけです。
デンマーク語、

@ Musikero31 EFを使用して、すべてのエンティティ接続文字列をコードで定義します。私はそれに関連する設定には何もありません。
キースビアード

DALファイルを新しいプロジェクトにコピーした後、上記のエラーも受け取りました。構成ファイルを詳しく見ると、接続文字列がEFに置き換えられていることに気付きました。正しい接続文字列を新しいプロジェクトに手動でコピーして貼り付けることができ、うまくいきました。
Ravi Ram、

9

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

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

接続文字列を.edmxに直接貼り付けるというMortezaの解決策は、そこに値を貼り付けることができないため機能しませんでした。


3
私のexeのディレクトリにapp.configのみ(およびそれがそのディレクトリにある唯一の構成ファイル)であったとしても、読み取れませんでした。myExe.exe.configファイルの名前を変更する必要がありました
Mario

6

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

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

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

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

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


6

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

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

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

最後に、app.configファイルをメインプロジェクトからテストプロジェクトにコピーしました。これが正しいステップであるか、または追加のモデルが追加されたときに保守性の問題が発生するかどうかはわかりませんが、少なくとも私の単体テストは今再び正しく実行されています。


これを投稿したので、別のプロジェクトのapp.configファイルへのリンクを作成するのがおそらく最善だと思いました。ただし、構成ファイルがまったくない場合は、元の問題を修正するために他のアプローチが機能します。
S.バギー2013

4

モルテザManavi」答えは、この問題を解決しない、別の解決策は、動的に接続文字列を構築し、あなたの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

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

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

の代わりに

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

2

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

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

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

私たちのチームには過去にこの問題がありました。覚えるのに少し時間がかかりましたが、これも以前に修正した方法とまったく同じです。


1

私はn'tierアーキテクチャを使用していて、同じ問題が発生しましたが、これは私に役立ちます。これがuに役立つことを願っています。まず、あなたは同じ持っているconnection stringあなたにlibraries、あなたがのようにDBにアクセスできる場所app.configweb.config あなたは、単に今は2コンストラクタ1がデフォルトとuは追加した他の1(ある持っていることを、オーバーロードコンストラクタ.edmx中(Model.context.cs)ファイルを追加することをした後過負荷)。

        public YourEntityName(string connString)
            : base(connString)
        {
        }

1

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


0

まあ...この問題は非常に単純な(ダム)理由である可能性もあります...別のプロジェクトからファイルをコピーして、EntityDataSourceのConnectionStringを変更するのを忘れていました...プロジェクトの最初にいて、ログインページでは、これは構成にあるものだと思っていましたが、接続文字列名(およびDefaultContainerName)が間違っているだけでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.