アプリケーションを構築するためにエンティティフレームワークとASP.NET MVC 4を使用しています
私の解決策は2つのプロジェクトに分かれています。
私の問題は、 'MyEntites'DbContextを使用しようとすると、次のエラーが発生することです。
アプリケーション構成ファイルに 'MyEntities'という名前の接続ストリングが見つかりませんでした。
問題は、接続文字列がMVCプロジェクトではなくクラスライブラリのapp.config内にあるという事実に関係していると思います。
誰かが何か提案がありますか?
接続文字列をMVCプロジェクトの.configファイルにコピーしてみてください。
その通りです。これは、クラスライブラリ(.edmxファイル)がスタートアップ/メインプロジェクトではないために起こります。
接続文字列をメインプロジェクトの設定ファイルにコピーする必要があります。
あなたのスタートアップ/メインプロジェクトが(私のコンソールアプリケーションの場合のように)設定ファイルを持っていないのであれば、それを追加するだけです(スタートアッププロジェクト - 新しい項目の追加 - >アプリケーション設定ファイル)。
より関連性の高い情報がここにあります: MetadataException:指定されたメタデータリソースをロードできません
プロジェクトを(DbContextを使って)スタートアップとして作成したことを確認してください
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'
それからもう一度やり直してください
接続文字列を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がある場所からsetUpプロジェクトを開始します。
おわかりのように、それはクラスライブラリのapp.configにある接続文字列と関係があります。
クラスapp.configからコンテナのapp.config
またはweb.config
ファイルにエントリをコピーします。
「スタートアッププロジェクトに設定」に設定されているプロジェクトのapp.configファイルまたはweb.configファイルに接続文字列をコピーし、データ層でエンティティフレームワークを使用する場合は、メインプロジェクトにエンティティフレームワークnugetをインストールしてください。
スタートアッププロジェクトがからに変更され、が変更されない場合も同様です。 - )接続文字列を持つ。
必ず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>
ええ、それはばかげています。接続ビルダーを使用して、接続文字列をコピーしないようにすることができます。 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)
ソリューションに複数のプロジェクトを使用していますか。
あなたがそうであれば、あなたがチェックしなければならないWeb設定はde .edmxファイルと同じプロジェクト上のものであるので
複数のproyect、EntityFrameworkプロジェクトのweb.configとapp.configを使用したstart proyectを使用すると、この問題が発生しました。
この問題を回避するためにあなたがしなければならない:
私は同じ問題に直面しました。他の層からデータアクセス操作を行っているので、スタートアッププロジェクトに接続文字列を入力するのに失敗しました。起動プロジェクトにapp.configがない場合は、app.configファイルを追加してから、その設定ファイルに接続文字列を追加します。
MVCプロジェクトWeb.configファイルにConnectionStringを追加します。
.edmxファイルを含むプロジェクトによって生成された接続文字列は接続文字列を生成します。これは、出力ディレクトリにコピーされ、実行時設定情報を格納するために実行可能ファイルによって参照されるファイルのapp.configからのホールドオーバーのようです。
Webプロジェクトのweb.configファイルにランダムな.config情報を追加するための自動処理がないため、これはWebプロジェクトで中断します。
最も簡単な方法は、接続文字列を設定ファイルからweb.configファイルの接続セクションにコピーし、設定ファイルの内容を無視することです。
これはまた、呼び出し元のコードで参照されているDLL参照が不十分になる可能性があります。小さな不器用なハックはあなたの日を救うことができます。
私はDBファーストのアプローチに従い、DALクラスライブラリプロジェクトでEDMXファイルを作成しました。これはBALクラスライブラリを参照していました。これはWCFサービスによって参照されていました。
私はBALでこのエラーを得ていたので、DALプロジェクトのApp.configから設定詳細をコピーするために上記の方法を試みましたが、解決しませんでした。最終的に友人の助言を得て、WCFプロジェクトにダミーのEDMXファイルを(関連するDBコネクティビティなどと共に)追加したので、必要なものすべてをインポートしてから、EDMXファイルを削除して、クリーンビルド.
別の回答で示されているように、私はプロジェクトをスタートアップとして設定しないことでこれを得ました。これに対する私の貢献 - Add-MigrationsとUpdate-Databaseを実行するとき、Nuget Package Managerコンソールのコマンドの一部としてスタートアッププロジェクトを指定します( '['や ']'文字を含めないでください。そこにあるテキストをあなたのプロジェクト名に変更する必要があります。
それはそれをするべきです。
スタートアッププロジェクトのROOT web.configに接続文字列を配置したことを確認してください
私はMVCプロジェクトのWeb.Config(.edmxファイルは別のクラスライブラリプロジェクトに配置されていました)に既に接続文字列を持っていましたが、ここでも明らかなことを言っているのはちょっとわかりましたが。なぜ例外が発生し続けるのかわからないのですが…長い間、接続文字列を誤ってViews\Web.Configにコピーしました。ソリューションエクスプローラのシナリオ。ええ、これらのことはベテラン開発者にも起こります:)
2つのオプションがあります - ここで全員が最初に提案したのは、接続文字列がプロジェクトのWeb.configファイルにあることを確認することです。 Azureアプリケーション設定からの接続文字列を操作するときは、Web.configの値をAzureの値で上書きします。
プログラムで移行を実行している場合は、Web.configに保存せずに動的に(またはAzureアプリケーションの設定を介して)取得された接続文字列を使用して移行を実行できます。
構成のTargetDatabaseを設定するときは、接続を取得するDbConnectionInfoコンストラクターを使用します。接続名だけを取るコンストラクタの代わりに、文字列とプロバイダ名。接続文字列にプロバイダー名がなく、SQL Server/Azure SQLを使用している場合は、 "System.Data.SqlClient"を使用します。
これに対処するために私が見つけた最良の方法は、一時的にそのプロジェクト(おそらくクラスライブラリ)をスタートアッププロジェクトに設定することです。これにより、パッケージマネージャコンソールはそのプロジェクトを設定ソースとして使用します。このように設定されている理由の一部は、econfigファイルが通常従うトップダウンモデルのためです。経験則として、クライアント(たとえばMVCアプリケーション)に最も近いプロジェクトは、使用されるweb.configまたはapp.configです。
次のようにクラスライブラリを参照する '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です)。
この問題は、プロジェクトでレイヤーを使用しており、DataLayerでEntityフレームワークを定義またはインストールしてプロジェクトを実行しようとした場合に発生します。
そのため、この問題を解決するには、Edmxファイルがあるレイヤーから接続文字列をコピーして、メインweb.configに接続文字列を貼り付けます。
MSTestを実行しているとき、私はこの問題を抱えていました。 "noisolation"フラグがないと動作しませんでした。
うまくいけば、これは誰かに役立ちます。それを理解するのに私に多くの時間がかかりました。 IDEからすべてうまくいった。この文脈でEntity Frameworkについて何か奇妙なことがあります。