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 中并解决问题。 : )

...