如何根据MVC网站的子域更改EF连接字符串?
我有一个EF5 ASP.NET MVC 3(Razor)网站,在IIS7下运行。 现在我希望能够根据URL的子域将连接字符串更改为MSSQL数据库,例如foo.mydomain.com
应该连接到我的“Foo”数据库,并且bar.mydomain.com
应该连接到“Bar “数据库。
很明显,DNS记录的设置使它们都指向同一个网站。
实现这一目标的最有效方式是什么?
你为什么不开始将自己的SqlConnection
传递给YourDbContext
?
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");
这不是很容易...您应该更改对象上下文的构造函数以动态更改连接字符串。 使用System.Web.HttpContext.Current.Request.Url.Host
获取子域名。 然后用它来计算正确的连接字符串。
您应该在设计器生成的代码中执行此操作。 当然,这不是一个好的地方..使它使用T4模板。 打开你的模型并右键单击空白的设计器表面,然后选择“添加代码生成项目” - > Ado.net实体对象生成。 这将创建一个.tt文件。 打开它并查找构造函数语法。 在那里添加你的逻辑。
祝你好运!
我提出了我认为比迄今为止提出的所有建议都更好的解决方案。 我使用的是默认的EntityModelCodeGenerator
,所以也许还有其他更好的解决方案适用于其他模板 - 但这对我来说很合适:
MyEntities
的另一半。 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 Catalogs*=.*?;", RegexOptions.IgnoreCase);
if (!match.Success) return;
var newDbString = "initial catalog={0};".Fmt(dbName);
ec.StoreConnection.ConnectionString = ec.StoreConnection.ConnectionString.Replace(match.Value, newDbString);
}
链接地址: http://www.djcxy.com/p/12131.html
上一篇: How to change an EF connection string, based on subdomain of MVC web site?