IIS7で実行されているEF5ASP.NETMVC 3(Razor)Webサイトがあります。ここで、URLのサブドメインに応じてMSSQLデータベースへの接続文字列を変更できるようにします。たとえばfoo.mydomain.com
、「Foo」データベースにbar.mydomain.com
接続し、「Bar」データベースに接続する必要があります。
明らかに、DNSレコードは、すべて同じWebサイトを指すように設定されています。
これを達成するための最も効率的な方法は何ですか?
IIS7で実行されているEF5ASP.NETMVC 3(Razor)Webサイトがあります。ここで、URLのサブドメインに応じてMSSQLデータベースへの接続文字列を変更できるようにします。たとえばfoo.mydomain.com
、「Foo」データベースにbar.mydomain.com
接続し、「Bar」データベースに接続する必要があります。
明らかに、DNSレコードは、すべて同じWebサイトを指すように設定されています。
これを達成するための最も効率的な方法は何ですか?
簡単ではありません... オブジェクト コンテキストのコンストラクターを変更して、接続文字列を動的に変更する必要があります。を使用してサブドメイン名を取得しSystem.Web.HttpContext.Current.Request.Url.Host
ます。次に、それを使用して適切な接続文字列を計算します。
これは、デザイナーが生成したコードで行う必要があります。もちろん、これは良い場所ではありません..T4テンプレートを使用して機能させるには。モデルを開き、空白のデザイナー サーフェイスを右クリックし、[コード生成項目の追加] -> [Ado.net エンティティ オブジェクトの生成] を選択します。これにより、.tt ファイルが作成されます。それを開いて、コンストラクターの構文を探します。そこにロジックを追加します。
幸運を!
これまでに提案されたすべての解決策よりも優れた解決策だと思うものを思いつきました。私はデフォルトを使用しているEntityModelCodeGenerator
ので、おそらく他のテンプレートには他のより良い解決策がありますが、これは私にとってはうまくいきます:
MyEntities
。OnContextCreated()
クラス コンストラクター内から呼び出されるOverride 。これは次のようになります。
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);
}
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");
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 と出来上がり。
最近、ホストヘッダーを使用して、使用する必要があるconnectionStringNameを決定するカスタム構成を追加することで、そのようなことを行いました。
EF5 には、この名前を処理できるコンストラクターがあります。
var context = new MyDbContex("name=<DBConnectionStringName>");