2

我想更改我们的 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.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年!!!:-]

谢谢你的帮助!

4

1 回答 1

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");
于 2013-07-26T03:50:51.497 回答