8

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

显然,DNS 记录的设置是为了让它们都指向同一个网站。

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

4

6 回答 6

1

你为什么不开始把你自己的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");
于 2013-03-04T11:30:00.333 回答
1

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

您应该在设计器生成的代码中执行此操作。当然,这不是一个好地方.. 使用 T4 模板使其工作。打开您的模型并右键单击空白设计器表面,然后选择“添加代码生成项”-> Ado.net 实体对象生成。这将创建一个 .tt 文件。打开它并查找构造函数语法。在那里添加你的逻辑。

祝你好运!

于 2013-03-04T11:35:49.673 回答
1

我提出了我认为比迄今为止提出的所有解决方案更好的解决方案。我正在使用 default EntityModelCodeGenerator,所以也许还有其他更好的其他模板解决方案 - 但这对我有用:

  1. 创建部分类的另一半MyEntities
  2. Override OnContextCreated(),从类构造函数中调用。
  3. 使用正则表达式更改存储连接字符串。

结果如下:

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-04T12:59:22.863 回答
0

在 web.config 中使用不同的连接字符串。如果您可以进行有条件的 XSL 转换,可能会进行一些研究,这样,当您在特定配置上发布时,web.Release.config 会将您的 Web.Config 更改为您需要的样子。

或者,使用|DataDirectory|字符串替换 - http://msdn.microsoft.com/en-us/library/cc716756.aspx

更多关于 DataDirectory 字符串替换的信息: http ://forums.asp.net/t/1835930.aspx/1?Problem+With+Database+Connection

我想,如果您想按书行事,请为每个单独的版本创建构建配置,并将连接字符串放在相应的 web..config 中,当您发布时,XSL 转换会将连接字符串放在生成的 web 中.config 和瞧。

于 2013-03-04T11:18:23.737 回答
0

我最近通过添加一些自定义配置做了类似的事情,它使用主机头来确定必须使用的连接字符串名称。

EF5 有一个构造函数,可以处理这个名字

var context = new MyDbContex("name=<DBConnectionStringName>");
于 2013-03-04T11:18:30.340 回答
0

我只是为一个项目做的

public partial class admpDBcontext : DbContext
{

    public static string name
    {
        get
        {
            if (System.Web.HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority).ToString() == "http://fcoutl.vogmtl.com")
            {
               return "name=admpDBcontext";
            }
            else { return "name=admpNyDBcontext"; }
        }

    }


    public admpDBcontext()
        : base(name)
    {

    }
}

在 web.config 中,我添加了 connectionString。

于 2017-10-06T16:13:47.650 回答