如何根据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?

    下一篇: Facebook share link is not showing image