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

有人有什么想法吗?

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

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


当前回答

我刚花了30分钟玩这个。我重命名了实体对象,重命名了配置文件中的条目,但还有更多…您还必须更改对CSDL的引用

很容易错过-如果您正在重命名,请确保您获得所有内容....

其他回答

我能够在Visual Studio 2010, VB.net (ASP.NET) 4.0中解决这个问题。

在实体模型向导期间,您将能够看到实体连接字符串。从这里,您可以复制并粘贴到连接字符串中。

我唯一缺少的是连接字符串中的“App_Code.”。

entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"

有同样的问题,我从数据库重新创建了edmx。 解决了我的问题。

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

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

我在解决方案文件夹中包含项目的解决方案中遇到了同样的问题,当它们被移动到解决方案根目录时(为了克服Mvc3AppConverter由于项目位置而导致的疑似bug)。

尽管在需要时重新添加了所有*项目引用后编译了解决方案,但在网站启动时抛出了错误。

EDMX在其中一个被移动的项目(“Data”项目)中,但当然,缺少对Data项目的引用并不会导致编译错误,只是运行时错误。

简单地将缺少的引用添加到主项目就解决了这个问题,根本不需要编辑连接。

我希望这能帮助到其他人。

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