突然,在实例化生成的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;)。

其他回答

这意味着应用程序无法加载EDMX。有几种情况会导致这种情况。

您可能已经将模型的MetadataArtifactProcessing属性更改为Copy to Output Directory。 连接字符串可能错误。我知道您说您没有更改它,但如果您更改了其他内容(例如,程序集的名称),它仍然可能是错误的。 您可能正在使用编译后任务将EDMX嵌入到程序集中,但由于某种原因该程序集中不再工作。

简而言之,你的问题中没有足够的细节来给出准确的答案,但希望这些想法能让你走上正确的轨道。

更新:我已经写了一篇博客文章,介绍了更完整的故障排除步骤。

我编写了这个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;
    }
}

当我在构建新的.edmx设计器之前没有清理解决方案时,就会发生这种情况。因此,在构建新的。edmx设计器之前,不要忘记清理解决方案。这可以帮助我跳过很多问题。如果你是visual studio的新手,那么下面提供的导航细节。

点击- > Build >清洁解决方案 单击“->Build->Rebuild Solution”

希望这能有所帮助。谢谢大家

有时包含模型的程序集不会被加载:

    [TestMethod]
    public void TestOpenWithConfigurationAfterExplicit()
    {
        String dummy = typeof(MallApp).Assembly.FullName;  
        //force the assembly loaded.
        using (DbContext ctx = new DbContext("name=MyContainer))
        {
        }
    }

MallApp类型位于与实体模型相同的程序集中。如果没有显式加载,则会抛出System.Data.MetadataException。

我也有同样的问题。我用反射器查看了我的编译dll,发现资源的名称是不正确的。我重新命名了,现在看起来很好。