突然、私は生成されたMetadataException
クラスをインスタンス化することでObjectContext
を取得し続けます。 App.Configの接続文字列は正しいように見えます - 最後に動作してから変わっていません - そして私は変更なしで基礎となるデータベースから新しいモデル(edmx-file)を再生成しようとしました。
誰かアイデアがありますか?
詳細:プロパティは変更していません。出力アセンブリの名前は変更していません。アセンブリにEDMXを埋め込むことはしていません。仕事を辞めてから戻ってくるまで10時間待っただけです。それからそれはもう働いていませんでした。
EDMXを再作成してみました。プロジェクトを再作成してみました。データベースを一から作り直すこともしました。運が悪くて、まったく。
これは、アプリケーションがEDMXをロードできないことを意味します。これを引き起こす可能性があることがいくつかあります。
要するに、あなたの質問には正確な答えを出すのに十分な詳細があるわけではありませんが、うまくいけばこれらのアイデアがあなたを正しい方向に導くはずです。
更新: 私は トラブルシューティングのためのより完全なステップを含むブログ記事 を書きました。
この小さな変更は、この問題に役立ちます。
私は3つのプロジェクトで解決策を持っています。
connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;
への変更
connectionString="metadata=res://*/;
Edmxがあるプロジェクト内にあり、他のプロジェクトから使用しているときに、この例外が発生する可能性があります。
その理由はRes://*/
はCURRENTアセンブリ内のリソースを指すURIです。 Edmがそれを使用しているコードとは異なるアセンブリで定義されている場合、リソースが見つからないためres:// * /は機能しません。
「*」を指定するのではなく、代わりにアセンブリのフルネーム(公開鍵トークンを含む)を指定する必要があります。例えば:
res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...
接続文字列を構築するためのより良い方法はEntityConnectionStringBuilderを使うことです。
public static string GetSqlCeConnectionString(string fileName)
{
var csBuilder = new EntityConnectionStringBuilder();
csBuilder.Provider = "System.Data.SqlServerCe.3.5";
csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName);
csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
typeof(YourObjectContextType).Assembly.FullName);
return csBuilder.ToString();
}
public static string GetSqlConnectionString(string serverName, string databaseName)
{
SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder();
providerCs.DataSource = serverName;
providerCs.InitialCatalog = databaseName;
providerCs.IntegratedSecurity = true;
var csBuilder = new EntityConnectionStringBuilder();
csBuilder.Provider = "System.Data.SqlClient";
csBuilder.ProviderConnectionString = providerCs.ToString();
csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
typeof(YourObjectContextType).Assembly.FullName);
return csBuilder.ToString();
}
それでも例外が発生する場合は、アセンブリをリフレクタで開き、.csdl、.ssdl、および.mslファイルのファイル名を確認してください。リソースの名前がメタデータの値で指定されているものと異なる場合は、機能しません。
私は同じようなエラーがありました。私はこのプロジェクトを再作成し(長い話)、古いプロジェクトからすべてを引き継ぎました。私のモデルが以前は 'Model'という名前のディレクトリにあったこと、そして今は 'Models'という名前のディレクトリにあることに気づいたことはありません。私のWeb.Configでこの接続を変更したら:
<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl
これに:
<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl
すべてうまくいった(Model
をModels
に変更)。この文字列のこの3つの場所を変更しなければならなかったことに注意してください。
そしてReflectorなしでモデル名をチェックする簡単な方法....ディレクトリを探す
... obj/{設定出力}/edmxResourcesToEmbed
そして、.csdl、.msl、および.ssdlリソースファイルがあることを確認します。それらがサブディレクトリにある場合は、サブディレクトリの名前をモデル名の前に付ける必要があります。
たとえば、私の3つのリソースファイルはサブディレクトリ Data にあるので、接続文字列は次のようになります。
metadata = res:// * / データ 。MyModel.csdl | res:// * / データ 。MyModel.ssdl | res:// * / データ 。MyModel.msl;
(対メタデータ= res://*/MyModel.csdl | res://*/MyModel.ssdl | res://*/MyModel.msl;)。
私もこの問題を抱えていました、そしてそれは私のweb.configのconnectionstringが私のEDMXが配置されているアセンブリのapp.configのそれとわずかに異なっていたためでした。なぜそれが変わったのかわかりませんが、ここに2つの異なるバージョンがあります。
App.config:
<add name="SCMSEntities" connectionString="metadata=res://*/Model.SMCSModel.csdl|res://*/Model.SMCSModel.ssdl|res://*/Model.SMCSModel.msl;provider=System.Data.SqlClient;provider connection string="data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" providerName="System.Data.EntityClient" />
Web.config:
<add name="SCMSEntities" connectionString="metadata=res://*/Model.SCMSModel.csdl|res://*/Model.SCMSModel.ssdl|res://*/Model.SCMSModel.msl;provider=System.Data.SqlClient;provider connection string="data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
それが修正したのは、単にapp.config文字列(末尾の小さな違いに注意してください - "App=EntityFramework
"ではなく "application name=EntityFramework
")をweb.configにコピーするだけで問題は解決しました。 :)
誤ってedmxファイルのビルドアクション(IDEの[プロパティ]の下に表示されます)を 'EntityDeploy'から 'None'に切り替えたときに、これが起こりました。 EntityDeployはあなたのためにメタデータをポピュレートするものです: http://msdn.Microsoft.com/en-us/library/cc982037.aspx を見てください
これで幸せな30分を過ごしました。エンティティオブジェクトの名前を変更し、設定ファイルのエントリの名前を変更しましたが、それ以外にもcsdlへの参照を変更する必要があります。
見逃しがちです - 名前を変更している場合は、 すべて ....を入力してください。
私はこのエラーに丸一日を費やしました
n-tear architecture
を使っているなら
またはDataAccessLayerからEDMX
へのDomainModelLayer
から生成されたseparate Models
を試みた
多分あなたはこのエラーが出ます
webconfig (UILayer)
とappconfig (DataAccessLayer)
の接続文字列が同じであることを確認することです。2番目に重要なのはconnection string
connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provid.....
これが問題です
地球上のどこから私はModel
または私の接続文字列内のどんな.csdlでもそれらがどこにあるのか
ここで私の解決策は絵を見て
助けてくれることを願います
これは私が新しい.edmxデザイナーを構築する前に解決策をきれいにしないと私に起こります。ですから、新しい.edmxデザイナーを構築する前に、ソリューションをきれいにすることを忘れないでください。これは私がこの問題に関してもっと多くの問題をスキップするのを助けます。提供されているナビゲーションの詳細を確認してください。
クリック - >ビルド - >クリーンソリューション
それからクリック - >ビルド - >ソリューションの再構築
お役に立てれば。みんな、ありがとう
私は同じ問題を抱えていました。私は反射鏡で私の迎合的なdllを調べました、そして、資源の名前が正しくないのを見ました。私は名前を変更し、それは今大丈夫に見えます。
私の場合は、edmxファイルのプロパティを変更することで解決します。
これで問題は解決しました。問題は、コンテナがメタデータを見つけようとしたときに、見つけられないことです。だから、単に同じ議会でそれを作る。別のアセンブリにedmxファイルがある場合、この解決策は機能しません
私はVisual Studio 2010、VB.net(ASP.NET)4.0でこれを解決することができました。
エンティティモデルウィザードの間に、エンティティ接続文字列を見ることができます。そこから接続文字列にコピー&ペーストすることができます。
私が欠けていた唯一のものは "App_Code"でした。接続文字列で。
entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"
究極の解決策は、他の2台のマシン、およびEDMXおよびその他の雑貨でデータベースを再作成した後でも、Entity Frameworkの初版を使用しないことでした。 .NET 4.0で再び評価することを楽しみにしています。
同じ問題に再び遭遇して答えを探し続けたところ、最終的に同じ問題を抱えていた人を見つけました。接続文字列がVisual Studioのウィザードによって正しく生成されず、メタデータリソースへのリンクに重要なパスが欠けていたようです。
v1.0 BUG ?:指定されたメタデータリソースをロードできません。スクリプト!=モデル
2013-01-16の更新:EF Code Firstプラクティスをほぼ排他的に使用するように移行しました(既存のデータベースを使用する場合でも)この問題はもう問題ではありません。私にとって、それは自動生成されたコードと構成による混乱を減らし、製品に対する私自身のコントロールを高めるための実行可能なソリューションでした。
私の問題と解決策、症状は同じ「指定されたメタデータリソースをロードできません」でしたが、根本的な原因は異なっていました。私はソリューションに2つのプロジェクトを持っていました。1つはEntityModel、もう1つはソリューションです。実際にEntityModelのEDMXファイルを削除して再作成しました。
解決策は、Webアプリケーションプロジェクトに戻り、この行を設定ファイルに追加しなければならなかったことです。新しいモデルは、 "other"プロジェクトのWeb.Configファイルに複製しなければならない項目をいくつか変更しました。古い設定はもはや良くありませんでした。
<add name="MyEntities"
connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=Q\DEV15;initial catalog=whatever;
user id=myuserid;password=mypassword;
multipleactiveresultsets=True;
application name=EntityFramework""
providerName="System.Data.EntityClient" />
何時間ものグーグルで解決しようとすると、解決策はどれもうまくいきませんでした。ここにいくつか解決策を挙げました。私は私のために働いたものにも注目しました。 (私はEFバージョン6.1.1、およびSQL Server 2014を使用していましたが、古いDBを使用しています)
connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl;
(これらはファイルです。ソリューションエクスプローラーの〜/ obj/..ディレクトリの下にある[すべてのファイルを表示]を切り替えることができます)...そして私が試した多くのこと[EntityFrameworkのバージョンを新しいバージョンに戻すこと(よくわからない)]
私にとってうまくいったこと:
この からの記事 から、それは私が私の問題を解決するのを助けました。 EDMXファイルでProviderManifestToken="2012"
をProviderManifestToken="2008"
に変更しました。これをする:
ソリューションエクスプローラ
それが役立つことを願っています。
あなたのためにSelftrackingEntities
name__ユーザー、Microsoftウォークスルーに従い、Objectコンテキストクラスを(context .ttにリンクすることによって)wcfサービスプロジェクトに分離したなら、この答えはあなたのためです:
この記事で示した回答の一部で、次のようなコードが含まれています。
... = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
typeof(YourObjectContextType).Assembly.FullName);
あなたのために働かないでしょう!その理由は、YourObjectContextType.Assembly
は(wcfプロジェクトアセンブリ内の)別のアセンブリに存在するからです。
YourObjectContextType.Assembly.FullName
を - >に置き換えます。
ClassTypeThatResidesInEdmProject.Assembly.FullName
楽しむ。
私の場合、この問題はモデルのedmxファイルの名前を変更することに関連していました。csdl/ssdl/mslファイルのapp.config接続文字列を修正することで問題が解決しました。
EF 4.0デザイナを使用してcsdl/ssdl/mslを生成している場合、これら3つの「ファイル」は実際にはモデルのメインのedmxファイルに格納されます。この場合、Waqasによる投稿はほぼ注目に値します。彼の例の "Model_Name"は、現在のモデルの.edmxファイルの名前(.edmxを除く)に変更する必要があることを理解することが重要です。
また、edmxファイルがプロジェクトのルートレベルにない場合は、Model_Nameの前に相対パスを付ける必要があります。
res://*/MyModel.WidgetModel.csdl|res://*/MyModel.WidgetModel.ssdl|res://*/MyModel.WidgetModel.msl
csdl/ssdl/msl xmlは、モデルファイル 'WidgetModel.edmx'に保存され、 'MyModel'という名前のフォルダーに保存されます。
ObjectContextオブジェクトがそれを使用しているプロジェクトとは異なるプロジェクトで定義されている場合に、それらのインスタンスを作成するためのヘルパークラスを作成しました。設定ファイルの接続文字列を解析し、「*」を完全なアセンブリ名に置き換えます。
それはオブジェクトを構築するためにリフレクションを使うので完璧ではありませんが、それは私が見つけることができるそれをする最も一般的な方法です。
誰かに役立つことを願っています。
public static class EntityHelper<T> where T : ObjectContext
{
public static T CreateInstance()
{
// get the connection string from config file
string connectionString = ConfigurationManager.ConnectionStrings[typeof(T).Name].ConnectionString;
// parse the connection string
var csBuilder = new EntityConnectionStringBuilder(connectionString);
// replace * by the full name of the containing Assembly
csBuilder.Metadata = csBuilder.Metadata.Replace(
"res://*/",
string.Format("res://{0}/", typeof(T).Assembly.FullName));
// return the object
return Activator.CreateInstance(typeof(T), csBuilder.ToString()) as T;
}
}
私はこれと同じエラーメッセージに問題がありました。私の問題は、Visual Studio 2010を閉じて再度開くことで解決しました。
同じ問題を抱えながら、データベースからedmxを再作成しました。私の問題を解決しました。
例外は、コンパイラが存在しないMetadataを指しているため、app.config
connectionsStringをWeb.config
ConnectionStringにコピーするだけであるためです。
私は議会の名前を変更したので同じ問題を抱えていた。
また、Properties/AssemblyInfo.csプロジェクトのAssemblyTitle属性とAssemblyProduct属性で名前を変更し、edmxファイルへの参照を削除して追加し直す必要がありました。
それからそれはちょうどうまくいきました。
別のプロジェクトのedmxを使用している場合は、接続文字列を変更します。
metadata=res://*/Data.DataModel.csdl
...に...
metadata=res://*/DataModel.csdl
質の悪いapp.configファイルまたはweb.configファイルでこれを実行できます。Upでapp.config接続文字列を自分のweb.configにコピーし、次のように入力していました。
<connectionStrings>
<connectionStrings>
<add name="name" connectionString="normalDetails"/>
</connectionStrings>
</connectionStrings>
プロジェクトをソリューションルートに移動したときに、ソリューションフォルダーにプロジェクトが含まれていたソリューションでも同じ問題が発生しました(プロジェクトの場所によるMvc3AppConverterのバグの疑いを克服するため)。
*すべてのプロジェクト参照が必要に応じて再追加された後にソリューションがコンパイルされましたが、Webサイトが起動したときにエラーが発生しました。
EDMXは移動されたプロジェクトの1つ( 'Data'プロジェクト)にありますが、もちろんDataプロジェクトへの参照の欠如はコンパイルエラーを引き起こさず、ただ実行時エラーを引き起こしました。
欠けている参照を主プロジェクトに追加するだけでこの問題は解決され、接続を編集する必要はまったくありません。
私はこれが他の人に役立つことを願っています。
プロジェクトでこのエラーが発生することがあります。私はそれを解決します
1 - EDMXファイルを右クリックし
2 - Run Custom Tool
オプションを選択
3 - プロジェクトを再構築
EDMXファイルを含むクラスライブラリを参照していませんでした。
既存の.edmxを新しいプロジェクトにインポートしていて、ベース名前空間が別のサブディレクトリにインポートされていても接続を更新しなければならなかったことを除けば、Rickと同じ問題と解決策がありました。異なるサブディレクトリ名を含めるための、Web.Config内の文字列
この例外のもう1つの原因は、ObjectQueryに関連テーブルを含めるのに、間違ったナビゲーションプロパティ名を入力した場合です。
例:
var query = (from x in myDbObjectContext.Table1.Include("FKTableSpelledWrong") select x);
{Path.To.The。}ではなく、次のようにパスを入力してください。res:// /{Path.To.The.}YourEdmxFileName.csdl|res:// / {Path.To.The YourEdmxFileName.ssdl | res:// */{Path.To.The。} YourEdmxFileName.msl
他の人が言っているように、res:\\はあなたのリソースへのポインタです。リソース名が正しいことを確認して確認するには、JetBrainsによる DotPeek のような逆コンパイラを使用して.dllファイルを開き、Resourcesファイルを参照します。
または、デバッグ中にウォッチウィンドウを開いてこのコードを貼り付けると、現在実行中のアセンブリ内のリソース名の配列を取得できます。
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()
そうは言っても、メタデータパスの形式は次のようになります。
{my-Assembly-name}/{おそらく名前空間}。{クラス名}。{csdlまたはssdlまたはmsl}
私の場合、リストされた答えのどれもうまくいかなかったので、私はこれを投稿しています。
私の場合は、Visual StudioをベースにしてIIS expressで実行するとうまくいきました。しかし、スタンドアロンWebサイトとしてNantスクリプトを使用してデプロイしていたときにエラーが発生していました。私は上記のすべての提案を試した後、ナントスクリプトによって生成されたDLLがVSによって生成されたものよりはるかに小さいことに気付きました。そして私は、Nantが.csdl、.msl、および.ssdlファイルを見つけることができなかったことに気づきました。そのため、この問題を解決するには、実際には2つの方法があります。1つは、Visual Studioが生成した後で必要なファイルをコピーし、それらをビルド展開に含めることです。そしてWeb.configで、パスを次のように指定します。
"metadata=~/bin/MyDbContext.csdl|~/bin/MyDbContext.ssdl|~/bin/MyDbContext.msl;provider=System.Data.SqlClient;...."
これはあなたが手動であなたが走らせているウェブサイトのbinディレクトリにファイルをコピーしたと仮定しています。別のディレクトリにある場合は、それに応じてパスを変更します。 2番目の方法は、NantスクリプトでEdmGen.exeを実行し、ファイルを生成してから、それらを以下の例のようにリソースとして含めることです。 https://github.com/qwer/budget/blob/master/nant.build
私は、データアクセス層とユーザーインターフェース層を分離しました。だから私は各層のエンティティ接続文字列があります。
これら2つの分離された接続文字列を同じになるように変更する前に、以下のエラーがまだ発生しています。
Unable to load the specified metadata resource
だから私はそれらの2つの層(DAL、UI)のために同じ接続文字列になるようにします、それは完璧に働きます。
私の解決策は、それらがすでに提示されている場所に関係なく、すべての接続文字列を同じにすることです。。
私の場合は、EntityConnectionStringBuilderを使用して接続文字列を作成していたためです。 Metadataプロパティがモデル名(名前空間を含む)を使用していることを確認してください。
メタデータの問題を整理したところ、app.configでXXXEntitiesの接続文字列を見つけることができない呼び出し例外の形式で、後続の問題が発生しました(ここでの目標はapp.configへの依存性ではありません)。運が良かったので、私のユニットテストプロジェクトでSystem.Dataを参照することで、この最後のハードルがクリアされたことがわかりました。要約すると:
私は今、参照dbから更新できるクラスライブラリの中に私のメタデータを持っています、そして実行時に私は私のアプリケーションと単体テストをあらゆるサーバー上のあらゆるdbに向けることができます。
補遺:edmxをフォルダに移動したときに、もう一度エラーが発生しました。ちょっと調べたところ、メタデータの文字列は次のようになります。metadata = res://EPM.DAL/Models.EPM.csdl。ここで、EPM.DALはアセンブリの名前、EPM.edmxはモデルフォルダ。
私のedmxファイルがビルド前のコマンドで削除されたとき、私はこのエラーに遭遇しました。それがそれほど単純であることに気づく前に私にしばらく時間がかかりました。
私はこの問題にも直面しています、私はただうまく動く解決策をきれいにして作り直すだけです。
モデルを含むアセンブリがロードされていないことがあります。
[TestMethod]
public void TestOpenWithConfigurationAfterExplicit()
{
String dummy = typeof(MallApp).Assembly.FullName;
//force the Assembly loaded.
using (DbContext ctx = new DbContext("name=MyContainer))
{
}
}
型MallApp
は、エンティティモデルと同じアセンブリ内にあります。明示的なロードがないと、System.Data.MetadataException
がスローされます。
私の理論は、もしあなたが同じ名前の複数のedmxファイル(例えばModel1)を持っているなら、それはその例外を与えるということです。私はそれらが独立しているべきだと思っていたので私がModel1として私のすべてのedmxファイルに名前を付けることを決めたとき同じ問題を抱えていました。
私は昨日この問題を抱えていて、デバッグ中のコードとSQL Profilerからの出力を見ていました。
この記事を読んで理解する前に理解できなかったのは、EntityFrameworkがDBを呼び出すときにこのエラーをスローしていた理由です。私はSQL Profilerの何百もの行を調べて、データベースモデルの問題点を解決しようとしていました。期待していた電話のようなものが見つからなかったし、正直なところ探しているものがわからなかった。
この位置にいる場合は、接続文字列を確認してください。私の推測は、EntityFrameworkがSQLを作成する前に、接続文字列のメタデータ部分で指定されたモデルをチェックするということです。私の場合、それは間違っていました。 EntityFrameworkはDBの範囲でさえそれを作っていませんでした。
名前が正しいことを確認してください。これを整理した後、SQLプロファイラで、ApplicationNameが 'EntityFramework'で、期待されるテーブルを呼び出している呼び出しを確認しました。
この問題は、ソース管理エクスプローラのあるフォルダから別のフォルダに大きなソリューションを移動した後に発生しました。私たちはパッケージフォルダーをTeam Foundationにチェックインしないので、VSは自動的にパッケージをダウンロードしたと思います。これで私のEFフォームv6.1.2がv6.1.3にアップグレードされました。
元のv6.1.2にダウングレードすると、問題は解決しました。
私にとっても同様の問題です。クラス名がファイル名と異なりました。生成された接続文字列はファイル名ではなくクラス名を持っていました。私のための解決策はクラス名と一致するように私のファイルの名前を変更することでした。