我有一个在IIS7下运行的EF5 ASP.NET MVC3 (Razor)网站。现在,我希望能够根据URL的子域更改到MSSQL数据库的连接字符串,例如,foo.mydomain.com应该连接到我的"Foo“数据库,而bar.mydomain.com应该连接到"Bar”数据库。
显然,DNS记录被设置为它们都指向相同的网站。
实现这一目标的最有效方法是什么?
发布于 2013-03-04 20:59:23
我想出了一个我认为比目前所有这些建议更好的解决方案。我使用的是默认的EntityModelCodeGenerator,所以可能有其他更好的解决方案来解决其他模板--但这对我来说很有效:
创建分部类MyEntities.
OnContextCreated()的另一半,它是使用正则表达式从类constructor.
OnContextCreated()中调用的。结果如下所示:
partial void OnContextCreated()
{
// change connection string, depending on subdomain
if (HttpContext.Current == null) return;
var host = HttpContext.Current.Request.Url.Host;
var subdomain = host.Split('.')[0];
switch (subdomain)
{
case "foo":
ChangeDB("Foo");
break;
case "bar":
ChangeDB("Bar");
break;
}
}
private void ChangeDB(string dbName)
{
var ec = Connection as EntityConnection;
if (ec == null) return;
var match = Regex.Match(ec.StoreConnection.ConnectionString, @"Initial Catalog\s*=.*?;", RegexOptions.IgnoreCase);
if (!match.Success) return;
var newDbString = "initial catalog={0};".Fmt(dbName);
ec.StoreConnection.ConnectionString = ec.StoreConnection.ConnectionString.Replace(match.Value, newDbString);
}发布于 2013-03-04 19:30:00
为什么不开始向YourDbContext传递自己的SqlConnection
var partialConString = ConfigurationManager.ConnectionStrings["DBConnectionStringName"].ConnectionString;
var connection = new SqlConnection("Initial Catalog=" + Request.Url.Host + ";" + partialConString);
var context = new MyDbContext(connection, true);您还可以在DBContext中更改数据库:
context.Database.Connection.ChangeDatabase("newDbname");发布于 2013-03-04 19:35:50
这并不容易..。您应该更改对象上下文的构造函数以动态更改连接字符串。使用System.Web.HttpContext.Current.Request.Url.Host获取子域名。然后使用它来计算正确的连接字符串。
您应该在设计器生成的代码中执行此操作。当然这不是一个好地方..要使其正常工作,请使用T4模板。打开模型,右键单击空白设计器图面,然后选择"Add code generation item“-> Ado.net entity object generation。这将创建一个.tt文件。打开它并查找构造函数语法。在这里添加你的逻辑。
祝好运!
https://stackoverflow.com/questions/15200220
复制相似问题