CSharp - MetadataException: Unable to load the specified metadata resource

  显示原文与译文双语对照的内容

突然我得到了一個 MetadataException 在實例化我生成的ObjectContext 類。 App.Config 中的連接字元串看起來是正確的- 自從上次工作之後沒有改變- 我嘗試從底層資料庫重新生成一個新的模型( edmx-file ),但沒有改變。

任何人都有任何想法?

更詳細的細節:我沒有更改任何屬性,我沒有改變任何輸出程序集的名稱,我沒有嘗試將EDMX嵌入程序集中。 我只等了 10小時下班后才回來。 然後它就不再工作了。

我嘗試重新創建 EDMX 。 我嘗試重新創建項目。 我甚至試著從頭開始重新創建資料庫。 沒有運氣,任何。

时间:

當Edmx在一個項目中並且你正在使用另一個項目時,你可以得到這個異常。

原因是 Res://*/ 是指向當前程序集中資源的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 文件的文件名。 當資源的名稱與元數據值中指定的名稱不同時,它將不會工作。

我也有類似的錯誤。 我重新創建了項目( 長篇故事),並從舊項目中提取了一切。 我沒有意識到我的模型已經在一個名為'型號'的目錄中,現在在一個名為'型號'的目錄中。 在我的Web.Config 中更改了連接之後:


<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl

對此:


<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl

一切都奏效了( 注意,我必須在這個字元串中更改這三個位置。

我也有這個問題,這是因為 Web.Config 中的connectionstring與我的EDMX所在的程序集的app.config 稍有不同。 不知道為什麼會改變,但這裡有兩個不同的版本。

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=&quot;data source=SANDIEGOsql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" 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=&quot;data source=SANDIEGOsql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient"/>

修復它的方法是將 app.config 字元串( 注意末尾的小差異- 而不是" App=EntityFramework"它想要" application name=EntityFramework") 複製到 Web.Config 中並解決問題。 : )

...