我希望以这样的方式更改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="data source=testsvr;initial catalog=DEMO;persist security info=True;user id=sa;password=xxxxxxxx;MultipleActiveResultSets=True;App=EntityFramework"" 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年! : - ]
感谢您的帮助!
答案 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");