突然,在实例化生成的ObjectContext类时,我一直得到一个MetadataException。App.Config中的连接字符串看起来是正确的-自从上次它工作以来没有改变-我已经尝试从底层数据库中重新生成一个没有变化的新模型(edmx-file)。
有人有什么想法吗?
进一步的细节:我没有更改任何属性,没有更改任何输出程序集的名称,也没有尝试将EDMX嵌入到程序集中。我只是下班后等了10个小时才回来。然后它就不管用了。
我试过重新创造EDMX。我试着重新创建这个项目。我甚至尝试从头开始重新创建数据库。不管怎样,运气不好。
对我来说,我把数据访问层和用户界面层分开了。
每一层都有实体连接字符串。
在我将这两个分离的连接字符串修改为相同之前,我仍然发现下面的错误。
Unable to load the specified metadata resource
所以我让这两个层(DAL, UI)是相同的连接字符串,它的工作完美。
我的解决方案是使所有的连接字符串是相同的,无论他们已经提出。
我编写了这个helper类,当ObjectContext对象定义在与使用它的项目不同的项目中时,它可以创建对象的实例。我解析配置文件中的连接字符串,并将'*'替换为完整的程序集名称。
它并不完美,因为它使用反射来构建对象,但这是我能找到的最通用的方法。
希望它能帮助到别人。
public static class EntityHelper<T> where T : ObjectContext
{
public static T CreateInstance()
{
// get the connection string from config file
string connectionString = ConfigurationManager.ConnectionStrings[typeof(T).Name].ConnectionString;
// parse the connection string
var csBuilder = new EntityConnectionStringBuilder(connectionString);
// replace * by the full name of the containing assembly
csBuilder.Metadata = csBuilder.Metadata.Replace(
"res://*/",
string.Format("res://{0}/", typeof(T).Assembly.FullName));
// return the object
return Activator.CreateInstance(typeof(T), csBuilder.ToString()) as T;
}
}
经过数小时的谷歌搜索和尝试解决建议的解决方案没有一个有效。我在这里列出了几个解决方案。我也注意到了对我有用的方法。(我使用的是EF版本6.1.1,SQL server 2014 -但旧的DB)
重新构建项目并重试。
关闭和打开VS -我不知道这是怎么回事
确保如果你已经把。edmx文件放在一个目录中,确保你在你的连接字符串中包含了目录。例如,我的是在DAL文件夹。所以它看起来是这样的:connectionString="metadata=res://*/ dal . nammodel .csdl|res://*/ dal . nammodel .ssdl|res://*/ dal . nammodel .msl;你可以在解决方案资源管理器中切换显示所有文件,在~/obj/..目录)
...以及更多我尝试过的方法[比如:将EntityFramework版本恢复到后来的版本(不确定)]
对我有用的是:
这篇文章帮助我解决了我的问题。我只是在EDMX文件中将我的ProviderManifestToken=“2012”更改为ProviderManifestToken=“2008”。这样做:
解决方案资源管理器
右键单击文件。edmx
开放与. .
XML编辑器
使用2008更改ProviderManifestToken="XXXX"
我希望这对你有所帮助。