突然,在实例化生成的ObjectContext类时,我一直得到一个MetadataException。App.Config中的连接字符串看起来是正确的-自从上次它工作以来没有改变-我已经尝试从底层数据库中重新生成一个没有变化的新模型(edmx-file)。
有人有什么想法吗?
进一步的细节:我没有更改任何属性,没有更改任何输出程序集的名称,也没有尝试将EDMX嵌入到程序集中。我只是下班后等了10个小时才回来。然后它就不管用了。
我试过重新创造EDMX。我试着重新创建这个项目。我甚至尝试从头开始重新创建数据库。不管怎样,运气不好。
和一个快速的方法来检查模型名称没有Reflector....查找目录
...obj - {} - edmxResourcesToEmbed输出配置
检查.csdl、.msl和.ssdl资源文件是否存在。如果它们在子目录中,则子目录的名称必须加在模型名称之前。
例如,我的三个资源文件在一个子目录Data中,所以我的连接字符串必须是
元= res: / / * Data.MyModel.csdl | res: / * / Data.MyModel.ssdl | res: / * / Data.MyModel.msl;
(与元= res: / / * / MyModel csdl | res: / / * / MyModel ssdl | res: / / * / MyModel msl;)。
我编写了这个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;
}
}