アプリケーション構成ファイルで「MyEntities」という名前の接続文字列が見つかりませんでした


246

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

私のソリューションは2つのプロジェクトに分かれています。

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

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

「MyEntities」という名前の接続文字列がアプリケーション構成ファイルで見つかりませんでした。

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

誰か提案はありますか?


15
あなたとまったく同じコンテキストではありませんが(EF6での自動移行)、TFSで子ブランチを作成して作業を開始したときに、同様のエラーメッセージで同じ問題が発生しました。これは、mvcプロジェクトをスタートアッププロジェクトとしてマークすることで解決しました。出力 PM> Update-Database -Verbose Using StartUp project 'xxxxx.Web.Home'. Using NuGet project 'xxxxx.Web.Home.Dal'. Specify the '-Verbose' flag to view the SQL statements being applied to the target database. Target database is: 'MovieDatabase-0.0.2' (DataSource: (LocalDb)\v11.0, Provider: System.Data.SqlClient, Origin: Configuration).
メカニカルオブジェクト

回答:


309

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


63
完璧に動作しますが、参照されるプロジェクトが独自の構成ファイルを使用して接続文字列をフェッチしない理由を知りたいと思います。
ヌルヘッド2013年

7
@Alexander古い質問ですが、はい、その理由も知りたいです。
Kehlan Krumme 2013年

22
@Alexander、フレームワークは、実行中のアセンブリの構成ファイルをロードして使用します。この場合、それはWebプロジェクトです。クラスライブラリには通常、独自の構成ファイルはありません。
kiprainey 2014年

24
NuGet COnsoleのコンテキストで実行されるEnable-Migrationコマンドは、必ずしもスタートアッププロジェクトの構成ファイルを調べます。必ずしも、そのプロジェクトが含まれていると考えられるプロジェクトではありません。スタートアップにしたいapp.configでプロジェクトを設定するだけです。事業。必要に応じて、接続文字列を1つの構成ファイルに保存し、<connectionString configSource = "../ ProjectDir / SharedConnections.config" />によって他のプロジェクトで参照します
Ryan Mann

3
この正確なエラーメッセージが表示されましたが、正しいプロジェクトの.configファイルに正しい接続文字列が実際にリストされていました。しかし、私は変換を使用しており、接続文字列はもちろん変換された.configファイルで参照されていませんでした。構成ファイルの変換を使用している場合は、注意が必要です。
MortenNørgaard、2015

143

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

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

スタートアップ/メインプロジェクトに構成ファイルがない場合(コンソールアプリケーションの場合のように)、構成ファイルを追加するだけです(スタートアッププロジェクト-新しい項目の追加->アプリケーション構成ファイル)。

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


8
これに対する主な答えは、クラスライブラリ(.edmxファイルがある場所)はSTARTUPプロジェクトではないということです。スタートアッププロジェクトが、web.configが含まれているプロジェクトに設定されていないことに気付きました。これは、app.configが異なるコンソールアプリでした。したがって、コンソールアプリケーションをWebソリューションに追加する場合は、update-databaseを実行するときに、Webプロジェクトがスタートアッププロジェクトであることを確認してください。
Karl

1
何らかの理由でメインプロジェクトをアンロードしました。再ロードした後、マイグレーションを追加しようとするとこのエラーが発生しました。メインプロジェクトのスタートアッププロジェクトを再度作成すると、問題は解決しました。ありがとう@Oren
Azadrum

2
スタートアッププロジェクトが誤って変更されました。それが重要なポイントです。あなたの答えは本当に役に立ちました!
Fabio Milheiro、2015

98

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

プロジェクトを右クリックして選択します

または

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

または

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

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'

その後、もう一度お試しください


2
実際には、プロジェクトには接続文字列が含まれており、スタートアッププロジェクトとして設定する必要があります。通常は、DbContextファイルが置かれているプロジェクトではありません
Raymond Wang

1
...したがって、Set as Startup Project上記のスクリーンショットのように、Package Mgrが適切なレイヤーをターゲットとすることを確認することに加えて、そのまったく同じレイヤーである必要があります。(F5キーを押しても、クラスライブラリを起動できません)
bkwdesign

3
これは私の命を救った。パッケージマネージャーでは、デフォルトプロジェクトをコンテキストが設定されたプロジェクトに設定しましたが、それでもオーバーライドされませんでした。
garfbradaz 2017

1
「しかし、昨日はうまくいきました!まったく同じコマンドです!」=>これ!
Simon_Weaver 2018

1
最も簡単な方法=)
Alexandr

29

あなたは単に接続文字列を渡し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...
}

私のスタートアッププロジェクトが構成ファイルの検索を突然停止した理由の解決策を見つけることができなかったので、私も一日を終えました。app.configと<appname> .exe.configがスタートアッププロジェクトのビンに表示されていましたが、EntityFrameworkは、ずっと使用していた接続文字列を見つけることができませんでした。最近、未使用のプロジェクトをいくつかソリューションから削除しましたが、それが何か問題があるのではないかと思っています。ソリューションからWebプロジェクトを削除しました。私の他のプロジェクトがweb.configに依存していたのか、そのような異常なものに疑問を感じています。
GrayDwarf 2017年

実行中のプロジェクトの構成は、他のすべての子プロジェクトで使用されます。
Serj Sagan

1
しかし、プロバイダー名を設定する方法は?
FizxMike 2017

9

ご想像のとおり、接続文字列はクラスライブラリのapp.configにあります。

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


8

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


7

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


4

スタートアッププロジェクトがされている場合にも発生変わっ 1にしない持っている接続文字列を

  1. ソリューションを右クリック-プロパティをクリック
  2. Common Propertiesで、スタートアッププロジェクトを選択します。
  3. 右側のペインで、接続文字列を持つプロジェクトを選択します(ほとんどの場合、MVCプロジェクトになります-ソリューションを開始するプロジェクト)。

はい、動作します。私はEFがDBと通信するためのクラスライブラリを作成しましたが、同じ問題が発生していました。
Satinder Sidhu、2015

4
  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>

3

ええ、それはばかげています。接続ビルダーを使用すると、接続文字列のコピーを回避できます。VB.Netコード(本番環境で使用されていますが、ここで少し変更されているため、テストされていないため、問題が発生した場合はサポートしてください)、serverName変数、databaseName変数があり、それらをメソッドに渡して接続を生成します私のために:

    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)

2

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

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


はい、そうです。接続文字列を含むプロジェクトは、App.configファイルのみを含むクラスライブラリです。MVCプロジェクトはこれをチェックしていないようです。
jjc99 2012

開発中はプロジェクトのapp.configのみをチェックするので、そこに追加する必要があります
Diego

お返事ありがとうございます。edmxファイルを含むプロジェクトから接続文字列をコピーして、MVCプロジェクトのルートweb.configファイルに配置してみました。残念ながら、それでも接続文字列を見つけることができません。何らかの方法で接続文字列を変更する必要がありますか?
jjc99 2012

その逆です。開発時には、.edmxファイルを含むプロジェクトのapp.cofnigにcon文字列が必要です。もしあれば、名前が間違っているかもしれません。接続文字列の名前は、.edmxファイルの「エンティティコンテイナー名」プロパティと同じ名前にする必要があります
Diego


1

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

この問題を回避するには、次のことを行う必要があります。

  1. 開始された* .configファイルに接続文字列が必要です。
  2. EntityFramework DLLを参照にインストールする必要があります

1

私は同じ問題に直面しました。他のレイヤーからデータアクセス操作を実行しているときに、スタートアッププロジェクトに接続文字列を配置するのに失敗しました。また、起動プロジェクトにapp.configがない場合は、app.configファイルを追加してから、その構成ファイルに接続文字列を追加します。


1
ありがとう、プロジェクトの読み込みに問題があり、「スタートアッププロジェクト」が失われました。あなたの答えは、コンテキストファイルとapp.configを含むプロジェクトがスタートアップであることを確認するように私に思い出させました。
マストロ2017

1

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

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

それでうまくいくはずです。


このようにして、プロシージャにコマンドを含めることができ、スタートアッププロジェクトを常にデフォルトから変更する必要がありません。
JakeJ

1

これは、コンテキストクラスがDbContextから継承されているためです。あなたの俳優は次のようだと思います:

public MyEntities()
    : base("name=MyEntities")

name=... connectionStringの名前に変更する必要があります


0

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

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

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


0

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


0

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

私はここで明白なことを言っているのを知っていますが、それは私にも起こりました-私はすでにMVCプロジェクトのWeb.Configに接続文字列を持っています(.edmxファイルは別のクラスライブラリプロジェクトに配置されていました)と私はできませんでしたなぜ例外が発生し続けるのかわからない...簡単に言えば、接続文字列を誤ってViews \ Web.Configにコピーしました。疲労感とスクロールしないという奇妙な組み合わせで-the-solution-explorerシナリオ。うん、これらはベテランの開発者にも起こります:)


0

この問題は、プロジェクトでレイヤーを使用し、DataLayerでEntity frame workを定義またはインストールして、プロジェクトを実行しようとしたときに発生します

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


0

次のように、クラスライブラリを参照する「コンテナ」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

MSTestの実行中にこの問題が発生しました。「noisolation」フラグがないと機能しません。

うまくいけば、これは誰かを助けます。それを理解するのに多くの時間がかかりました。IDEからすべてが正常に実行されました。このコンテキストでのエンティティフレームワークの奇妙な点。


0

定期的な移行

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

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

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

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


0

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

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

BALでこのエラーが発生したため、上記の方法でDALプロジェクトのApp.configから構成の詳細をコピーしようとしましたが、解決しませんでした。最終的に友人のヒントを得て、ダミーのEDMXファイルをWCFプロジェクト(関連するDB接続など)に追加しただけで、必要なものがすべてインポートされ、その後、EDMXファイルを削除しただけで、問題が解消されましたクリーンなビルド。


0

@RyanMann のトップアンサーには次のようなコメントがあります。

接続文字列を1つの構成ファイルに保存し、他のプロジェクトでそれらを参照する <connectionString configSource="../ProjectDir/SharedConnections.config" />

これは素晴らしい提案です!

App.configファイルとWeb.configファイルの間で接続文字列を共有することもできます。

この提案に従いたい人は、このSOの回答に進んでください。ソリューション内の複数のプロジェクト間で接続文字列を共有するための非常に優れた段階的なガイドがあります。

唯一の注意点はconfigSource、同じディレクトリまたはサブディレクトリに存在する必要があることです。上記のリンクは、「リンクとして追加」を使用してこれを回避する方法を説明しています。


0

AutoCADプラグイン内でEFを使用しようとすると、このエラーが発生しました。CADプラグインは、acad.exe.configファイルから接続文字列を取得します。上記の接続文字列をacad構成ファイルに追加すると機能します。

クレジットはADN.NetworkからNorman.Yuanに送られます。


0

MVVMモデルを使用している場合は、接続文字列をプロジェクトのすべての部分にコピーしてみてください。

たとえば、ソリューションにクラスライブラリプロジェクトとwpfプロジェクトの2つのプロジェクトが含まれている場合、バックエンドプロジェクト(ライブラリクラスプロジェクト)の接続文字列をコピーし、そのコピーをwpfプロジェクトのApp.configファイルに配置する必要があります。

<connectionStrings>
  <add name="DBEntities" ... />
</connectionStrings>

それがあなたに役立つことを願っています:)


-2

Connectoinstrnigをweb.configファイルに追加する

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