突然,在实例化生成的ObjectContext类时,我一直得到一个MetadataException。App.Config中的连接字符串看起来是正确的-自从上次它工作以来没有改变-我已经尝试从底层数据库中重新生成一个没有变化的新模型(edmx-file)。

有人有什么想法吗?

进一步的细节:我没有更改任何属性,没有更改任何输出程序集的名称,也没有尝试将EDMX嵌入到程序集中。我只是下班后等了10个小时才回来。然后它就不管用了。

我试过重新创造EDMX。我试着重新创建这个项目。我甚至尝试从头开始重新创建数据库。不管怎样,运气不好。


当前回答

一个糟糕的app.config或web。配置文件可以做到这一点..我已经复制了app.config连接字符串到我的web。在我的UI中配置,最终进入:

<connectionStrings>
    <connectionStrings>
          <add name="name" connectionString="normalDetails"/>
    </connectionStrings>
</connectionStrings>

其他回答

有同样的问题,因为我重命名了一个程序集。

我还必须在项目属性/AssemblyInfo.cs中的AssemblyTitle和AssemblyProduct属性中重命名它,并删除并重新添加对edmx文件的引用。

然后它运行得很好。

我也有这个问题,这是因为我的网络中的连接字符串。config与我的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=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

. 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=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

修复它只是简单地复制App .config字符串(注意结尾的小差异-而不是“App=EntityFramework”,它想要“应用程序名称=EntityFramework”)到web。解决了配置和问题。:)

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

我也犯过类似的错误。我重新创建了项目(说来话长),并从旧项目中提取了所有内容。我没有意识到我的模型之前在一个名为“模型”的目录中,而现在在一个名为“模型”的目录中。一旦我改变了我的网络连接。配置如下:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl 

:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl

一切正常(模型改为模型)。注意,我必须改变字符串中的这三个位置。

我也遇到了类似的问题。我的类名与我的文件名不同。生成的connectionstring中包含类名而不是文件名。对我来说,解决方案就是重命名我的文件以匹配类名。