この質問にはすでに答えがあります。
このコード:
using (EntityConnection conn = new EntityConnection("name=ELSCommonEntities"))
{
conn.Open();
}
次のようなエラーが表示されます。
Test method ELS.Service.Business.IntegrationTest.Base.ServiceBaseIntegrationTest.StartLoggingTestMethod threw exception: System.Data.MetadataException: Unable to load the specified metadata resource..
次のスタックトレースを使用してください。
System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.LoadResources(String assemblyName, String resourceName, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.CreateResourceLoader(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
System.Data.Metadata.Edm.MetadataArtifactLoader.Create(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver)
System.Data.EntityClient.EntityConnection.SplitPaths(String paths)
System.Data.EntityClient.EntityConnection.GetMetadataWorkspace(Boolean initializeAllCollections)
System.Data.EntityClient.EntityConnection.InitializeMetadata(DbConnection newConnection, DbConnection originalConnection, Boolean closeOriginalConnectionOnFailure)
System.Data.EntityClient.EntityConnection.Open()
ELS.Service.Business.Base.ServiceBase.StartLogging(String userWindowsLogon) in C:\C-TOM\ELS-RELEASE1\ELS.Service.Business\Base\ServiceBase.cs: line 98
ELS.Service.Business.IntegrationTest.Base.ServiceBaseIntegrationTest.StartLoggingTestMethod() in C:\C-TOM\ELS-RELEASE1\ELS.Service.Business.IntegrationTest\Base\ServiceBaseIntegrationTest.cs: line 65
ただし、同じ接続文字列を使用する次のコードは、
using (ELSCommonEntities db = new ELSCommonEntities())
{
var res = from c in db.Logging
select c;
int i = res.Count();
}
エラーになりません。
接続文字列は次のとおりです。
<add name="ELSCommonEntities" connectionString="metadata=res://*/Common.CommonModel.csdl|res://*/Common.CommonModel.ssdl|res://*/Common.CommonModel.msl;provider=System.Data.SqlClient;provider connection string="Data Source=localhost;Initial Catalog=els5_demo;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
私はまたリフレクターでdllを開いたし、メタデータは大丈夫に見えます。
問題を見つけました。
標準のメタデータ文字列は次のようになります。
metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl
そしてこれはほとんどの場合うまく働きます。ただし、一部の(私のものを含む)Entity Frameworkは混乱し、どのDLLを調べるべきかわからない場合があります。したがって、メタデータ文字列を次のように変更します。
metadata=res://nameOfDll/Model.csdl|res://nameOfDll/Model.ssdl|res://nameOfDll/Model.msl
そしてそれはうまくいくでしょう。私が正しい方向に進んだのは、このリンクでした。
http://itstu.blogspot.com/2008/07/to-load-specified-metadata-resource.html
私は正反対の問題を抱えていましたが、単体テストでは動作しませんでしたが、サービスで動作しました。
同じエラーメッセージが表示され、問題は接続文字列のメタデータ部分でもありましたが、解決するにはもう少し深く掘り下げる必要があり、この小さなナゲットを共有したいと思いました。
メタデータ文字列は、それぞれ次のような3つのセクションで構成されています。
res://
(assembly)/
(model name).(ext)
どこで内線"csdl"、 "ssdl"、および "msl"です。
多くの人々にとって、アセンブリおそらく "*"である可能性があります。これは、ロードされたすべてのアセンブリが検索されることを示しているようです(私はこれについて大量のテストを行っていません)。 この部分は私にとって問題ではなかったので、私はあなたがアセンブリ名またはファイル名が必要であるかどうか(すなわち ".dll"の有無にかかわらず)についてコメントすることはできません。
のモデル名一部は名前と名前空間あなたのアセンブリに対するあなたの.edmxファイルの。 あなたが持っているのであればMy.DataAccessアセンブリとあなたが作成しますDataModels.edmxでモデルフォルダ、フルネームはMy.DataAccess.Models.DataModels。この場合、メタデータに "Models.DataModels。(ext)"が含まれます。
.edmxファイルを移動または名前変更したことがある場合は、(私の経験では)手動でメタデータ文字列を更新する必要があります。相対的な名前空間を変更したほうが頭痛が少なくて済みます。
DalProject.dll
フォルダがありますClient
どれがClient.edmx
その中にファイルします。それであなたはそれから取り替える//*/Client.(csdl/ssdl/msl)
と//DalProject/Client.Client.(csdl/ssdl/msl)
- Maverick
いくつかの可能な漁獲量があります。 最も一般的なエラーは、接続文字列のこの部分にあると思います。
res://xxx/yyy.csdl|res://xxx/yyy.ssdl|res://xxx/yyy.msl;
これは魔法ではありません。これが何を表しているのか理解したら、接続文字列を正しく取得できます。
まずはxxx部。それはあなたがEFコンテキストクラスを定義したアセンブリ名に他なりません。通常それは何かのようになりますMyProject.Data。 デフォルト値は*で、ロードされているすべてのアセンブリを表します。特定のアセンブリ名を指定した方がよいでしょう。
今YYY部。これはリソース名です。xxxアセンブリ。 通常、スラッシュではなくドットを使用した.edmxファイルへの相対パスのようなものになります。例えば。モデル/カタログ - Models.Catalogアプリケーションの正しい文字列を取得する最も簡単な方法は、xxxアセンブリ。それからテキストエディタ(私はTotal Commanderのデフォルトビューアが好きです)でアセンブリDLLファイルを開き、 "。csdl"を検索してください。通常、その文字列が複数回出現することはありません。
最終的なEF接続文字列は次のようになります。
res://MyProject.Data/Models.Catalog.DataContext.csdl|res://MyProject.Data/Models.Catalog.DataContext.ssdl|res://MyProject.Data/Models.Catalog.DataContext.msl;
Shiraz Bhaijiが答えたように、metadata = res:///Model.csdl | res:///Model.ssdl | res://*/Model.mslが当てはまりました。 しかし、私のモデルのローカライズ、名前空間、およびアセンブリ名に基づいて適切な文字列を構築することには、まだ問題がありました。非常に簡単な解決策は、Visual Studioで(名前を変更して元の名前に戻した後).edmxファイルの名前を変更することでした。これにより、Web.configの文字列が自動的に更新されます。
1つのソリューションで3つのプロジェクトに同じ問題があり、Webサイトプロジェクトの参照ファイルでedmxファイルがあるプロジェクトを参照するまで、すべての提案が機能しませんでした。
データベースを最初に移動しましたデータ・モデル開発の途中で別のプロジェクトへ私の側では不十分な計画(またはその欠如)。
最初は1つのプロジェクトで解決策を見つけました。それから私は別のプロジェクトをソリューションに追加し、データベースを再作成しました。データ・モデルSQL Serverデータベースから。
問題を解決するには - Entity Framework Entity Connectionを使用するとMetadataExceptionが発生する。新しいプロジェクトから自分のConnectionStringをコピーしました。Web.Config元のプロジェクトへWeb.Config。ただし、これは元のプロジェクトのすべての参照をnewに更新した後に発生しましたデータ・モデルプロジェクト。
それは単なる接続文字列エラーかもしれません、それは上記のプロセスによって解決されます、しかしあなたが複数のプロジェクトでdllのを使用しているなら接続文字列が適切に命名されることを確かめることは確かにエラーを修正します。
私を動かすとき私はこの問題を抱えていた.edmx
あるプロジェクトから別のプロジェクトへのデータベースの最初のモデル。
私は単に次のようにしました。
app.config
またはweb.config