63

この質問にはすでに答えがあります。

このコード:

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=&quot;Data Source=localhost;Initial Catalog=els5_demo;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

私はまたリフレクターでdllを開いたし、メタデータは大丈夫に見えます。


  • スタックトレースと内部例外を含む完全な例外を必ず投稿してください。 ex.ToString()の結果を投稿する - John Saunders
  • 気にしないでください。フォーマットを修正するためにあなたの質問を編集しました。コードとしてフォーマットするには、4つのスペースでインデントする必要があります。それ以外の場合は、コードを選択して10101でボタンを押します。 - John Saunders
  • 先端をありがとう - Shiraz Bhaiji

8 답변


108

問題を見つけました。

標準のメタデータ文字列は次のようになります。

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

私は正反対の問題を抱えていましたが、単体テストでは動作しませんでしたが、サービスで動作しました。


  • &quot;いくつかのケース&quot;同じ名前の複数のedmxファイルがある場合(Model1など)。 - alpav
  • 私の&quot;ケース&quot;ソリューション内に1つの.edmxファイルしかありませんでした。何が起こったのかわかりませんが、それは恐ろしいことでした。 ;) - jfar
  • あなたが与えたリンクは私を答えに導いたので、あなたは私の支持を得ています!私は半日これで戦った。 res:// NameOfDLL / ...を試してみましたが、成功しませんでした。しかし、やっとres:// NameOfAssembly / ...で動作するようになりました。この場合、アセンブリ名が最後に.dllを持っていないことを除いて、それらは同じ名前でした。 - Kasey Speakman
  • 接続文字列を生成した後、モデルの名前空間を変更しました。指示に従って接続文字列を修正したところ、問題なく動作しました。 - Ryan Eastabrook
  • これで問題が解決したので、投票しました。ありがとうございます。 - l15a

44

同じエラーメッセージが表示され、問題は接続文字列のメタデータ部分でもありましたが、解決するにはもう少し深く掘り下げる必要があり、この小さなナゲットを共有したいと思いました。

メタデータ文字列は、それぞれ次のような3つのセクションで構成されています。

res://
      (assembly)/
      (model name).(ext)

どこで内線"csdl"、 "ssdl"、および "msl"です。

多くの人々にとって、アセンブリおそらく "*"である可能性があります。これは、ロードされたすべてのアセンブリが検索されることを示しているようです(私はこれについて大量のテストを行っていません)。 この部分は私にとって問題ではなかったので、私はあなたがアセンブリ名またはファイル名が必要であるかどうか(すなわち ".dll"の有無にかかわらず)についてコメントすることはできません。

モデル名一部は名前と名前空間あなたのアセンブリに対するあなたの.edmxファイルの。 あなたが持っているのであればMy.DataAccessアセンブリとあなたが作成しますDataModels.edmxモデルフォルダ、フルネームはMy.DataAccess.Models.DataModels。この場合、メタデータに "Models.DataModels。(ext)"が含まれます。

.edmxファイルを移動または名前変更したことがある場合は、(私の経験では)手動でメタデータ文字列を更新する必要があります。相対的な名前空間を変更したほうが頭痛が少なくて済みます。


  • ありがとうございました!インターネット上で利用可能なこれのための100の答えがあります、しかしこれはそれらのうちのどれへの最も役に立つ補遺です。明確な例:DalProject.dllフォルダがありますClientどれがClient.edmxその中にファイルします。それであなたはそれから取り替える//*/Client.(csdl/ssdl/msl)//DalProject/Client.Client.(csdl/ssdl/msl) - Maverick
  • 「My.DataAccess」のようです。必須ではありません; &quot; Models.DataModels&quot;のみpart(おそらく、検索された各アセンブリルート名前空間に関連して機能します)。 - James Wilkins

14

いくつかの可能な漁獲量があります。 最も一般的なエラーは、接続文字列のこの部分にあると思います。

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;


  • DLLを検索しています。ウルトラトップチップ。ありがとう:) - uniquelau

0

Shiraz Bhaijiが答えたように、metadata = res:///Model.csdl | res:///Model.ssdl | res://*/Model.mslが当てはまりました。  しかし、私のモデルのローカライズ、名前空間、およびアセンブリ名に基づいて適切な文字列を構築することには、まだ問題がありました。非常に簡単な解決策は、Visual Studioで(名前を変更して元の名前に戻した後).edmxファイルの名前を変更することでした。これにより、Web.configの文字列が自動的に更新されます。


0

1つのソリューションで3つのプロジェクトに同じ問題があり、Webサイトプロジェクトの参照ファイルでedmxファイルがあるプロジェクトを参照するまで、すべての提案が機能しませんでした。


0

データベースを最初に移動しましたデータ・モデル開発の途中で別のプロジェクトへ私の側では不十分な計画(またはその欠如)。

最初は1つのプロジェクトで解決策を見つけました。それから私は別のプロジェクトをソリューションに追加し、データベースを再作成しました。データ・モデルSQL Serverデータベースから。

問題を解決するには - Entity Framework Entity Connectionを使用するとMetadataExceptionが発生する。新しいプロジェクトから自分のConnectionStringをコピーしました。Web.Config元のプロジェクトへWeb.Config。ただし、これは元のプロジェクトのすべての参照をnewに更新した後に発生しましたデータ・モデルプロジェクト。


0

それは単なる接続文字列エラーかもしれません、それは上記のプロセスによって解決されます、しかしあなたが複数のプロジェクトでdllのを使用しているなら接続文字列が適切に命名されることを確かめることは確かにエラーを修正します。


0

私を動かすとき私はこの問題を抱えていた.edmxあるプロジェクトから別のプロジェクトへのデータベースの最初のモデル。

私は単に次のようにしました。

  1. の接続文字列を削除しましたapp.configまたはweb.config
  2. 'Model.edmx'を削除しました
  3. モデルをプロジェクトに再追加しました。

リンクされた質問


関連する質問

最近の質問