MVC4 + EntityFramework:仅在web.config中找到元数据 - 为什么?

时间:2013-07-24 12:25:48

标签: entity-framework asp.net-mvc-4 metadata connection-string ef-database-first

我希望以这样的方式更改EF驱动的数据库第一个ASP.NET MVC4 Web应用程序,以便我可以指定要在运行时连接的数据库。首先,我只想将web.config的 connectionStrings 部分中的条目替换为编码版本。但首先要做的事情。这是我的web.config连接部分:

  <connectionStrings>
    <add name="WEB_Entities" connectionString="metadata=~/bin/Models\WEB_Models.csdl|~/bin/Models\WEB_Models.ssdl|~/bin/Models\WEB_Models.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=testsvr;initial catalog=DEMO;persist security info=True;user id=sa;password=xxxxxxxx;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

使用此设置时,一切运行正常。现在我试着注释掉这个条目并对其进行硬编码,从而将设置从web.config移到global.asax.cs。

我读到了 EntityConnectionStringBuilder ,但首先我只想将整个连接字符串作为EntityConnection的构造函数参数:

    string CS =
    @"metadata=~/bin/Models\WEB_Models.csdl|
    ~/bin/Models\WEB_Models.ssdl|
    ~/bin/Models\WEB_Models.msl;
    provider=System.Data.SqlClient;
    provider connection string=""Data Source=testsvr\sqlexpress;
    Initial Catalog=DEMO;
    Integrated Security=True;MultipleActiveResultSets=True""";

    conn = new EntityConnection(CS);
    conn.Open();

conn对象是一个存在于我的应用程序类中的静态对象:

public static EntityConnection conn;

为了使用这个连接对象,我更改了我的DBContext代码,使用上述连接对象作为构造函数参数,而不是Web中条目的 Name 的.config:

public partial class WEB_Entities : DbContext
{
    public WEB_Entities()
        : base(PAMVCTEST.MvcApplication.conn,true)
        //: base("name=WEB_Entities")
    {
    }

现在,当我编译运行整个事情时,似乎可以连接到数据库服务器(因为我在例如将数据源更改为错误时遇到了一些与网络相关的错误),但是应用程序找不到给定的元数据文件。这是错误:

The supplied connection string is not valid, because it contains insufficient mapping or metadata information. Parameter name: connection

我不明白为什么无法找到元数据文件,它们肯定存在于给定位置。一旦我将所有内容更改回使用web.config连接条目,一切都按预期工作。

我还尝试将元数据文件位置更改为:

res://*/Models.WEB_Models.csdl|res://*/Models.WEB_Models.ssdl|res://*/Models.WEB_Models.msl

我确保ILMerge的资源名称是正确的。结果是一样的:当我使用 web.config 方式时,它可以工作 - 当我按代码设置时,我得到的错误与上面提到的相同。

我该怎么做才能解决这个问题?有没有解决方法?为什么在世界上我们必须应对这些可怕的,容易出错的连接字符串与嵌套的转义和东西?这是2013年! : - ]

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

从DbContext调用它。将您的DbContext构造函数更改为以下内容:

public class MyDbContext : DbContext
{
    public MyDbContext()
        : base("DefaultConnection")
    {

    }

    public MyDbContext(string conStr)
        : base(conStr)
    {

    }

    // ...
}

然后将您想要的ConStrs添加到Web配置中。最后,当你想要另一个ConStr而不是DefaultConnection将其名称传递给DbContext()构造函数时:

Models.MyDbContext db = new Models.MyDbContext("MyConStr");
相关问题