Entity Framework Entity Connectionを使用するとMetadataExceptionが発生する

entity-framework

質問

このコード:

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を開いたし、メタデータは大丈夫に見えます。

受け入れられた回答

問題を見つけました。

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

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)

extは "csdl"、 "ssdl"、および "msl"です。

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

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

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



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ