我有一个在 IIS7 下运行的 EF5 ASP.NET MVC 3 (Razor) 网站。现在我希望能够根据 URL 的子域更改 MSSQL 数据库的连接字符串,例如foo.mydomain.com
应该连接到我的“Foo”数据库,并bar.mydomain.com
应该连接到“Bar”数据库。
显然,DNS 记录的设置是为了让它们都指向同一个网站。
实现这一目标的最有效方法是什么?
我有一个在 IIS7 下运行的 EF5 ASP.NET MVC 3 (Razor) 网站。现在我希望能够根据 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 文件。打开它并查找构造函数语法。在那里添加你的逻辑。
祝你好运!
我提出了我认为比迄今为止提出的所有解决方案更好的解决方案。我正在使用 default 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 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);
}
在 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 和瞧。
我最近通过添加一些自定义配置做了类似的事情,它使用主机头来确定必须使用的连接字符串名称。
EF5 有一个构造函数,可以处理这个名字
var context = new MyDbContex("name=<DBConnectionStringName>");
我只是为一个项目做的
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。