突然私は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が1つのプロジェクト内にあり、それを別のプロジェクトから使用しているときに、この例外を受け取ることがあります。
その理由は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ファイルのファイル名を確認してください。リソースの名前がメタデータの値で指定されているものと異なる場合、機能しません。
res://MyAssembly/folder.<filename>.csdl...
- Ivan Ferrer Villa
私も同じような間違いがありました。私はそのプロジェクトを再作成し(長い話)、古いプロジェクトからすべてを引き継ぎました。私のモデルが以前は '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 / {config output} / edmxResourcesToEmbed
そして、.csdl、.msl、および.ssdlリソースファイルがあることを確認します。それらがサブディレクトリにある場合は、サブディレクトリの名前をモデル名の前に付ける必要があります。
たとえば、私の3つのリソースファイルはサブディレクトリにあります。データだから、私の接続文字列は
metadata = res:// * /データ.MyModel.csdl | res:// * /データ.MyModel.ssdl | res:// * /データ.MyModel.msl;
(対メタデータ= res://*/MyModel.csdl | res://*/MyModel.ssdl | res://*/MyModel.msl;)。
私もこの問題を抱えていました、そしてそれは私のEDMXが配置されているアセンブリのapp.configのものと私のweb.configのconnectionstringがわずかに異なっていたためでした。なぜ変更されたのかわかりませんが、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にし、問題が解決されました。:)
The .NET Framework data provider for SQL Server (SqlClient) supports many keywords from older APIs, but is generally more flexible and accepts synonyms for many of the common connection string keywords.
Entity Frameworkの接続文字列はその柔軟性を共有していないため、必要なキーワードのみを使用する必要があります。 - Suncat2000
これは私が誤って(IDEの[プロパティ]の下に表示される)edmxファイルのビルドアクションを 'EntityDeploy'から 'None'に切り替えたときに起こりました。 EntityDeployはあなたのためにメタデータをポピュレートするものです:http://msdn.microsoft.com/en-us/library/cc982037.aspx
これで幸せな30分を過ごしました。エンティティオブジェクトの名前を変更し、設定ファイルのエントリの名前を変更しましたが、それ以外にもcsdlへの参照を変更する必要があります。
見逃しがちです - 名前を変更している場合は、必ず入手してください。すべてのもの……
私は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"
私は同じ問題を抱えていました。私は反射鏡で私の迎合的なdllを調べました、そして、資源の名前が正しくなかったのを見ました。私は名前を変更し、それは今大丈夫に見えます。
私の場合は、edmxファイルのプロパティを変更することで解決します。
これで問題は解決しました。 問題は、コンテナがメタデータを見つけようとしたときに、見つけられないことです。だから同じアセンブリでそれを作るだけです。 別のアセンブリにedmxファイルがある場合、この解決策は機能しません
私はこのエラーに一日を費やした
一緒に働いているならn-tear architecture
またはあなたがしようとしたseparate Models
によって生成されますEDMX
DataAccessLayerからDomainModelLayer
多分あなたはこのエラーが出ます
webconfig (UILayer)
そしてappconfig (DataAccessLayer)
同じだ非常に重要ですconnection string
connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provid.....
これが問題です
地球上のどこから手に入れたModel
または、接続文字列内の任意の.csdl
ここで私の解決策は絵を見て
助けてくれることを願っています
究極の解決策(EDMXや他の雑貨と同様に他の2台のマシンでデータベースを再作成した後でも)は、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のバージョンを新しいバージョンに戻すこと(それについてはよくわからない)]
私にとってうまくいったこと:
これから記事はこちら、それは私が私の問題を解決するのを助けました。私はちょうど私を変えましたProviderManifestToken="2012"
にProviderManifestToken="2008"
EDMXファイル内。これをする:
ソリューションエクスプローラ
それが役立つことを願っています。
私の場合、この問題はモデルの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;
}
}
みんなのためSelftrackingEntities
ユーザー、
Microsoftのウォークスルーに従い、Objectコンテキストクラスを
wcfサービスプロジェクト(コンテキスト.ttにリンクすることによって)なので、この答えはあなたのためです。
この記事で示した回答の一部で、次のようなコードが含まれています。
... = 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デザイナーを構築する前に解決策をきれいにしないと私に起こります。ですから、新しい.edmxデザイナーを構築する前に、ソリューションをきれいにすることを忘れないでください。これは私がこの問題に関してもっと多くの問題をスキップするのを助けます。ビジュアルスタジオが初めての場合は、提供されるナビゲーションの詳細を確認してください。
クリック - >ビルド - >クリーンソリューション
それからクリック - >ビルド - >ソリューションの再構築
お役に立てれば。みんな、ありがとう
私はこれと同じエラーメッセージに問題がありました。私の問題は、Visual Studio 2010を閉じて再度開くことで解決しました。
私はアセンブリの名前を変更したので同じ問題を抱えていました。
また、Properties / AssemblyInfo.csプロジェクトのAssemblyTitle属性とAssemblyProduct属性で名前を変更し、edmxファイルへの参照を削除して追加し直す必要がありました。
それからそれはちょうどうまくいきました。
例外は、コンパイラが存在しないメタデータを指しているため、単にコピーすることです。app.config
接続文字列Web.config
ConnectionString
既存の.edmxを新しいプロジェクトにインポートしていて、ベース名前空間が別のサブディレクトリにインポートされていても接続を更新しなければならなかった以外は、Rickと同じ問題と解決策がありました。異なるサブディレクトリ名を含めるための、3か所にあるWeb.Config内の文字列。
プロジェクトをソリューションルートに移動したときに、ソリューションフォルダーにプロジェクトが含まれていたソリューションでも同じ問題が発生しました(プロジェクトの場所によるMvc3AppConverterのバグの疑いを克服するため)。
*すべての*プロジェクト参照が必要に応じて再追加された後にソリューションがコンパイルされましたが、Webサイトの起動時にエラーが発生しました。
EDMXは移動されたプロジェクトの1つ( 'Data'プロジェクト)にありますが、もちろんDataプロジェクトへの参照がないことでコンパイルエラーは発生せず、単に実行時エラーが発生しました。
欠けている参照を主プロジェクトに追加するだけでこの問題は解決され、接続を編集する必要はまったくありません。
これが他の人に役立つことを願っています。
質の悪いapp.configファイルまたはweb.configファイルでこれを実行できます。Upでapp.config接続文字列を自分のweb.configにコピーし、次のように入力していました。
<connectionStrings>
<connectionStrings>
<add name="name" connectionString="normalDetails"/>
</connectionStrings>
</connectionStrings>
別のプロジェクトのedmxを使用している場合は、接続文字列を変更します。
metadata=res://*/Data.DataModel.csdl
...に...
metadata=res://*/DataModel.csdl
私の理論は、もしあなたが同じ名前の複数のedmxファイル(例えばModel1)を持っているなら、それはその例外を与えるということです。 私はそれらが独立しているべきであると思ったのでModel1として私が私のすべてのedmxファイルに名前を付けることに決めたとき同じ問題を持っています。
この例外のもう1つの原因は、ObjectQueryに関連テーブルを含めるのに、間違ったナビゲーションプロパティ名を入力した場合です。
例:
var query = (from x in myDbObjectContext.Table1.Include("FKTableSpelledWrong") select x);