我想首先更改EF驱动的数据库ASP.NET MVC4 web应用程序,这样我就可以指定运行时要连接的数据库。一开始,我只是想用编码版本替换web.config的connectionStrings部分中的条目。但首先要做的事。这是我的web.config连接部分:
<connectionStrings>
<add name="WEB_Entities" connectionString="metadata=~/bin/ModelsWEB_Models.csdl|~/bin/ModelsWEB_Models.ssdl|~/bin/ModelsWEB_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/ModelsWEB_Models.csdl|
~/bin/ModelsWEB_Models.ssdl|
~/bin/ModelsWEB_Models.msl;
provider=System.Data.SqlClient;
provider connection string=""Data Source=testsvrsqlexpress;
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年!!:-]
谢谢你的帮助!
从DbContext调用它。将DbContext构造函数更改为以下内容:
public class MyDbContext : DbContext
{
public MyDbContext()
: base("DefaultConnection")
{
}
public MyDbContext(string conStr)
: base(conStr)
{
}
// ...
}
然后将您想要的ConStrs添加到web配置中。最后,当您想要除DefaultConnection
之外的另一个ConStr时,将其名称传递给DbContext()构造函数:
Models.MyDbContext db = new Models.MyDbContext("MyConStr");