ObjectContext
类时一直遇到MetadataException
。App.Config中的连接字符串看起来正确-自上次工作以来没有变化-并且我已经尝试从底层数据库重新生成新模型(edmx文件),但未发现改变。有人有任何想法吗?
更多细节:我没有更改任何属性,也没有更改任何输出程序集的名称,也没有尝试将EDMX嵌入程序集中。我仅仅离开工作10个小时,然后回来时它就不再工作了。
我已经尝试重新创建EDMX。我尝试重新创建项目。我甚至尝试从头开始重新创建数据库。但是没有任何运气。
ObjectContext
类时一直遇到MetadataException
。App.Config中的连接字符串看起来正确-自上次工作以来没有变化-并且我已经尝试从底层数据库重新生成新模型(edmx文件),但未发现改变。这意味着应用程序无法加载EDMX。导致此问题的原因有多种。
简而言之,在您的问题中没有足够的详细信息,以便给出准确的答案,但希望这些想法能让您走上正确的轨道。
更新:我写了一篇博客文章,提供了更完整的故障排除步骤。
通过轻微修改,我解决了这个问题。
我的解决方案包含了3个项目引用:
connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;
我将其更改为:
connectionString="metadata=res://*/;
使用不同程序集中定义的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 文件的文件名。当资源名称与元数据值中指定的名称不同时,它将无法工作。res://MyAssembly/folder.<filename>.csdl...
- Ivan Ferrer Villa我遇到了类似的错误。我重新创建了项目(长话短说),并将所有内容从旧项目中移动过来。我没有意识到我的模型以前在一个名为“Model”的目录中,现在在一个名为“Models”的目录中。一旦我在Web.Config中更改了连接:
<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl
变为这样:
<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl
所有的东西都起作用了(将Model
更改为Models
)。请注意,我不得不在该字符串中更改三个位置。
不用Reflector的快速检查模型名称的方法是查看目录
...obj/{配置输出}/edmxResourcesToEmbed
并检查是否存在.csdl、.msl和.ssdl资源文件。如果它们位于子目录中,则必须在模型名称前加上子目录的名称。
例如,我的三个资源文件位于子目录Data中,因此我的连接字符串必须为
metadata=res://*/Data.MyModel.csdl|res://*/Data.MyModel.ssdl|res://*/Data.MyModel.msl;
(而不是 metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;)
当我在构建新的.edmx设计器之前没有清理解决方案时,就会出现这种情况。因此,在构建新的.edmx设计器之前不要忘记清理解决方案。这帮助我避免了更多相关问题。如果您是Visual Studio的新手,请参考以下导航说明。
点击->生成->清理解决方案
然后点击->生成->重新生成解决方案
希望这可以帮到您。谢谢大家。
我也遇到了这个问题,原因是我的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="data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" 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="data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
解决方法很简单,只需要将app.config的字符串复制到web.config中(注意末尾的微小差别-它需要 application name=EntityFramework
而不是App=EntityFramework
),问题就解决了。:)
当我不小心将edmx文件(在IDE的属性下出现)的“Build Action”从“EntityDeploy”切换为“None”时,这种情况发生了。 EntityDeploy是为您填充元数据的内容:请参见http://msdn.microsoft.com/en-us/library/cc982037.aspx
metadata=res://*/Data.DataModel.csdl
...至...
metadata=res://*/DataModel.csdl
folder.subfolder
。 - qakmak
devenv /SafeMode
,解决方案无法运行(未加载所有项目 - 在“输出”中提供原因) - 但之后正常打开VS2022(没有进行任何更改),问题就消失了。_一切都恢复正常了。_值得尝试在安全模式下打开。 - Jonno