web-dev-qa-db-ja.com

アプリケーション構成ファイルに 'MyEntities'という名前の接続ストリングが見つかりませんでした

アプリケーションを構築するためにエンティティフレームワークとASP.NET MVC 4を使用しています

私の解決策は2つのプロジェクトに分かれています。

  • データモデル(.edmx)ファイルといくつかのカスタムインターフェイスを含むクラスライブラリ
  • 上記のクラスライブラリを参照する 'container' MVCプロジェクト

私の問題は、 'MyEntites'DbContextを使用しようとすると、次のエラーが発生することです。

アプリケーション構成ファイルに 'MyEntities'という名前の接続ストリングが見つかりませんでした。

問題は、接続文字列がMVCプロジェクトではなくクラスライブラリのapp.config内にあるという事実に関係していると思います。

誰かが何か提案がありますか?

230
jjc99

接続文字列をMVCプロジェクトの.configファイルにコピーしてみてください。

298
Jerry

その通りです。これは、クラスライブラリ(.edmxファイル)がスタートアップ/メインプロジェクトではないために起こります。

接続文字列をメインプロジェクトの設定ファイルにコピーする必要があります。

あなたのスタートアップ/メインプロジェクトが(私のコンソールアプリケーションの場合のように)設定ファイルを持っていないのであれば、それを追加するだけです(スタートアッププロジェクト - 新しい項目の追加 - >アプリケーション設定ファイル)。

より関連性の高い情報がここにあります: MetadataException:指定されたメタデータリソースをロードできません

135
Oren

プロジェクトを(DbContextを使って)スタートアップとして作成したことを確認してください

on the project right click and select

OR

App.config(またはweb.config)でスタートアップとして設定されているプロジェクトに接続文字列を追加します。

OR

このようなコマンドを呼び出します

Update-Database -Script -ProjectName '<project name>' -StartupProjectName '<project name>' -ConnectionString 'data source=.;initial catalog=<db name>;integrated security=True;MultipleActiveResultSets=True' -ConnectionProviderName 'System.Data.SqlClient'

それからもう一度やり直してください

88
CMS

接続文字列をEntityFrameworkに渡して、生活を続けることができます。

public partial class UtilityContext : DbContext
{
    static UtilityContext()
    {
        Database.SetInitializer<UtilityContext>(null);
    }

    public UtilityContext()
        : base("Data Source=SERVER;Initial Catalog=DATABASE;Persist Security Info=True;User ID=USERNAME;Password=PASSWORD;MultipleActiveResultSets=True")
    {
    }

    // DbSet, OnModelCreating, etc...
}
29
Serj Sagan

ソリューションに複数のプロジェクトがある場合は、真実のApp.configがある場所からsetUpプロジェクトを開始します。

8
W92

おわかりのように、それはクラスライブラリのapp.configにある接続文字列と関係があります。

クラスapp.configからコンテナのapp.configまたはweb.configファイルにエントリをコピーします。

8
podiluska

「スタートアッププロジェクトに設定」に設定されているプロジェクトのapp.configファイルまたはweb.configファイルに接続文字列をコピーし、データ層でエンティティフレームワークを使用する場合は、メインプロジェクトにエンティティフレームワークnugetをインストールしてください。

6
Ravi Anand

スタートアッププロジェクトがからに変更され、が変更されない場合も同様です。 - )接続文字列を持つ。

  1. 右クリックソリューション - プロパティをクリックして
  2. 「共通プロパティー」の下の「スタートアッププロジェクト」を選択します。
  3. 右側のペインで、接続文字列を含むプロジェクトを選択します(ほとんどの場合、それはMVCプロジェクトになります - ソリューションを開始するプロジェクト)。
5
Ravi Ganesan
  1. App.Configファイルを追加する
  2. プロジェクトをスタートアッププロジェクトとして設定します。
  3. 必ずentityFrameworkセクションの後に接続文字列を追加してください:

    <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    
    </configSections>
    
    <connectionStrings>
       <!-- your connection string goes here, after configSection -->
    </connectionString>
    
4
A-Sharabiani

ええ、それはばかげています。接続ビルダーを使用して、接続文字列をコピーしないようにすることができます。 serverName変数、databaseName変数があり、それらをメソッドに渡して接続を生成させるVB.Netコード(本番環境で使用されますが、ここでは少し変更されています。私のために:

    Dim EfBuilder As New System.Data.EntityClient.EntityConnectionStringBuilder("metadata=res://*/VMware.VmEf.csdl|res://*/VMware.VmEf.ssdl|res://*/VMware.VmEf.msl;provider=System.Data.SqlClient;provider connection string=""data source=none;initial catalog=none;integrated security=True;multipleactiveresultsets=True;App=EntityFramework""")
   Dim SqlBuilder As New Data.SqlClient.SqlConnectionStringBuilder(EfBuilder.ProviderConnectionString)
                        SqlBuilder.DataSource = serverName
                        SqlBuilder.InitialCatalog = databaseName
                        EfBuilder.ProviderConnectionString = SqlBuilder.ConnectionString
                        Using vmCtx As New VmEfConn(EfBuilder.ConnectionString)
3
Chalky

ソリューションに複数のプロジェクトを使用していますか。

あなたがそうであれば、あなたがチェックしなければならないWeb設定はde .edmxファイルと同じプロジェクト上のものであるので

2
Diego

複数のproyect、EntityFrameworkプロジェクトのweb.configとapp.configを使用したstart proyectを使用すると、この問題が発生しました。

この問題を回避するためにあなたがしなければならない:

  1. 接続文字列はstarted * .configファイルに必要です。
  2. あなたの参照にEntityFramework DLLをインストールしておく必要があります。
1
ch2o

私は同じ問題に直面しました。他の層からデータアクセス操作を行っているので、スタートアッププロジェクトに接続文字列を入力するのに失敗しました。起動プロジェクトにapp.configがない場合は、app.configファイルを追加してから、その設定ファイルに接続文字列を追加します。

1
Niraj Trivedi

MVCプロジェクトWeb.configファイルにConnectionStringを追加します。

1
Mehmedov

.edmxファイルを含むプロジェクトによって生成された接続文字列は接続文字列を生成します。これは、出力ディレクトリにコピーされ、実行時設定情報を格納するために実行可能ファイルによって参照されるファイルのapp.configからのホールドオーバーのようです。

Webプロジェクトのweb.configファイルにランダムな.config情報を追加するための自動処理がないため、これはWebプロジェクトで中断します。

最も簡単な方法は、接続文字列を設定ファイルからweb.configファイルの接続セクションにコピーし、設定ファイルの内容を無視することです。

0
Mike Beeler

これはまた、呼び出し元のコードで参照されているDLL参照が不十分になる可能性があります。小さな不器用なハックはあなたの日を救うことができます。

私はDBファーストのアプローチに従い、DALクラスライブラリプロジェクトでEDMXファイルを作成しました。これはBALクラスライブラリを参照していました。これはWCFサービスによって参照されていました。

私はBALでこのエラーを得ていたので、DALプロジェクトのApp.configから設定詳細をコピーするために上記の方法を試みましたが、解決しませんでした。最終的に友人の助言を得て、WCFプロジェクトにダミーのEDMXファイルを(関連するDBコネクティビティなどと共に)追加したので、必要なものすべてをインポートしてから、EDMXファイルを削除して、クリーンビルド.

0
sm2mafaz

別の回答で示されているように、私はプロジェクトをスタートアップとして設定しないことでこれを得ました。これに対する私の貢献 - Add-MigrationsとUpdate-Databaseを実行するとき、Nuget Package Managerコンソールのコマンドの一部としてスタートアッププロジェクトを指定します( '['や ']'文字を含めないでください。そこにあるテキストをあなたのプロジェクト名に変更する必要があります。

  1. 有効化 - 移行
  2. Add-Migrations -StartupProject [データコンテキストクラスを含むプロジェクト名]
  3. Update-Database -StartupProject [上記と同じプロジェクト名]

それはそれをするべきです。

0
JakeJ

スタートアッププロジェクトのROOT web.configに接続文字列を配置したことを確認してください

私はMVCプロジェクトのWeb.Config(.edmxファイルは別のクラスライブラリプロジェクトに配置されていました)に既に接続文字列を持っていましたが、ここでも明らかなことを言っているのはちょっとわかりましたが。なぜ例外が発生し続けるのかわからないのですが…長い間、接続文字列を誤ってViews\Web.Configにコピーしました。ソリューションエクスプローラのシナリオ。ええ、これらのことはベテラン開発者にも起こります:)

0
ShayLivyatan

定期的な移行

2つのオプションがあります - ここで全員が最初に提案したのは、接続文字列がプロジェクトのWeb.configファイルにあることを確認することです。 Azureアプリケーション設定からの接続文字列を操作するときは、Web.configの値をAzureの値で上書きします。

Azureまたは自動移行(プログラム)

プログラムで移行を実行している場合は、Web.configに保存せずに動的に(またはAzureアプリケーションの設定を介して)取得された接続文字列を使用して移行を実行できます。

構成のTargetDatabaseを設定するときは、接続を取得するDbConnectionInfoコンストラクターを使用します。接続名だけを取るコンストラクタの代わりに、文字列とプロバイダ名。接続文字列にプロバイダー名がなく、SQL Server/Azure SQLを使用している場合は、 "System.Data.SqlClient"を使用します。

0
neogeek

これに対処するために私が見つけた最良の方法は、一時的にそのプロジェクト(おそらくクラスライブラリ)をスタートアッププロジェクトに設定することです。これにより、パッケージマネージャコンソールはそのプロジェクトを設定ソースとして使用します。このように設定されている理由の一部は、econfigファイルが通常従うトップダウンモデルのためです。経験則として、クライアント(たとえばMVCアプリケーション)に最も近いプロジェクトは、使用されるweb.configまたはapp.configです。

0
gcoleman0828

次のようにクラスライブラリを参照する 'container' MVCプロジェクトのルートweb.configファイルに接続文字列を追加します。

 <connectionStrings>

  <add name="MyEntities" connectionString="complete connection string here" providerName="System.Data.SqlClient" />

  </connectionStrings>

接続名として「MyEntities」を使用したくない場合は、必要に応じて変更しますが、MyEntities DbContextクラスで次のように変更します。

MyEntities: DbContext
 {
   public MyEntities():base("Name-Of-connection-string-you wish to connect"){ }
 }

このエラーの理由は、接続文字列の名前を指定しない場合、またはDbConextの派生クラスで接続文字列を接続する場合(MyEntitiesの場合)、DbContextは自動的にルートweb.configファイルで接続文字列を検索します。派生クラス名と同じです(あなたの場合はMy Entitiesです)。

0
Pawan Rai

この問題は、プロジェクトでレイヤーを使用しており、DataLayerでEntityフレームワークを定義またはインストールしてプロジェクトを実行しようとした場合に発生します。

そのため、この問題を解決するには、Edmxファイルがあるレイヤーから接続文字列をコピーして、メインweb.configに接続文字列を貼り付けます。

0
Debendra Dash

MSTestを実行しているとき、私はこの問題を抱えていました。 "noisolation"フラグがないと動作しませんでした。

うまくいけば、これは誰かに役立ちます。それを理解するのに私に多くの時間がかかりました。 IDEからすべてうまくいった。この文脈でEntity Frameworkについて何か奇妙なことがあります。

0
Brian Wirt