使用實體框架實體連接時出現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

這在大多數情況下都可以正常工作。但是,在某些(包括我的)實體框架中,混淆並且不知道要查看哪個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

雖然我有相反的問題,但沒有在單元測試中工作,但在服務中工作。


熱門答案

我有相同的錯誤消息,問題也是連接字符串的元數據部分,但我不得不深入挖掘解決它,並希望分享這個小塊:

元數據字符串由三個部分組成,每個部分如下所示:

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

其中ext是“csdl”,“ssdl”和“msl”。

對於大多數人來說, 彙編可能是“*”,這似乎表明將搜索所有已加載的程序集(我沒有對此進行過大量的測試)。這部分對我來說不是問題,所以我不能評論你是否需要程序集名稱或文件名(即有或沒有“.dll”),雖然我已經看到這兩個建議。

模型名稱部分應該是.edmx文件相對於程序集的名稱和名稱空間 。因此,如果您有一個My.DataAccess程序集並在Models文件夾中創建DataModels.edmx ,則其全名為My.DataAccess.Models.DataModels 。在這種情況下,您的元數據中將包含“Models.DataModels。(ext)”。

如果您移動或重命名.edmx文件,則需要手動更新元數據字符串(根據我的經驗),並且記住更改相對命名空間會省去一些麻煩。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因