首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据MVC网站的子域更改EF连接字符串?

问如何根据MVC网站的子域更改EF连接字符串?
EN

Stack Overflow用户
提问于 2013-03-04 19:13:14
回答 6查看 4.1K关注 0票数 8

我有一个在IIS7下运行的EF5 ASP.NET MVC3 (Razor)网站。现在,我希望能够根据URL的子域更改到MSSQL数据库的连接字符串,例如,foo.mydomain.com应该连接到我的"Foo“数据库,而bar.mydomain.com应该连接到"Bar”数据库。

显然,DNS记录被设置为它们都指向相同的网站。

实现这一目标的最有效方法是什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-03-04 20:59:23

我想出了一个我认为比目前所有这些建议更好的解决方案。我使用的是默认的EntityModelCodeGenerator,所以可能有其他更好的解决方案来解决其他模板--但这对我来说很有效:

创建分部类MyEntities.

  • Override OnContextCreated()的另一半,它是使用正则表达式从类constructor.

  • Change
  1. OnContextCreated()中调用的。

结果如下所示:

代码语言:javascript
复制
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);
}
票数 1
EN

Stack Overflow用户

发布于 2013-03-04 19:30:00

为什么不开始向YourDbContext传递自己的SqlConnection

代码语言:javascript
复制
var partialConString = ConfigurationManager.ConnectionStrings["DBConnectionStringName"].ConnectionString;
var connection = new SqlConnection("Initial Catalog=" + Request.Url.Host + ";" + partialConString);
var context = new MyDbContext(connection, true);

您还可以在DBContext中更改数据库:

代码语言:javascript
复制
context.Database.Connection.ChangeDatabase("newDbname");
票数 1
EN

Stack Overflow用户

发布于 2013-03-04 19:35:50

这并不容易..。您应该更改对象上下文的构造函数以动态更改连接字符串。使用System.Web.HttpContext.Current.Request.Url.Host获取子域名。然后使用它来计算正确的连接字符串。

您应该在设计器生成的代码中执行此操作。当然这不是一个好地方..要使其正常工作,请使用T4模板。打开模型,右键单击空白设计器图面,然后选择"Add code generation item“-> Ado.net entity object generation。这将创建一个.tt文件。打开它并查找构造函数语法。在这里添加你的逻辑。

祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15200220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档