我想更改我们的 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 代码以使用上述连接对象作为构造函数参数,而不是网络中条目的 Name .配置:
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 配置中。最后,当您想要另一个 ConStr 而不是 DefaultConnection
时,将其名称传递给 DbContext() 构造函数:
Models.MyDbContext db = new Models.MyDbContext("MyConStr");
关于entity-framework - MVC4 + EntityFramework : metadata only found from within web. 配置 - 为什么会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17834005/