8

IIS7で実行されているEF5ASP.NETMVC 3(Razor)Webサイトがあります。ここで、URLのサブドメインに応じてMSSQLデータベースへの接続文字列を変更できるようにします。たとえばfoo.mydomain.com、「Foo」データベースにbar.mydomain.com接続し、「Bar」データベースに接続する必要があります。

明らかに、DNSレコードは、すべて同じWebサイトを指すように設定されています。

これを達成するための最も効率的な方法は何ですか?

4

6 に答える 6

1

簡単ではありません... オブジェクト コンテキストのコンストラクターを変更して、接続文字列を動的に変更する必要があります。を使用してサブドメイン名を取得しSystem.Web.HttpContext.Current.Request.Url.Hostます。次に、それを使用して適切な接続文字列を計算します。

これは、デザイナーが生成したコードで行う必要があります。もちろん、これは良い場所ではありません..T4テンプレートを使用して機能させるには。モデルを開き、空白のデザイナー サーフェイスを右クリックし、[コード生成項目の追加] -> [Ado.net エンティティ オブジェクトの生成] を選択します。これにより、.tt ファイルが作成されます。それを開いて、コンストラクターの構文を探します。そこにロジックを追加します。

幸運を!

于 2013-03-04T11:35:49.673 に答える
1

これまでに提案されたすべての解決策よりも優れた解決策だと思うものを思いつきました。私はデフォルトを使用しているEntityModelCodeGeneratorので、おそらく他のテンプレートには他のより良い解決策がありますが、これは私にとってはうまくいきます:

  1. 部分クラスの残りの半分を作成しますMyEntities
  2. OnContextCreated()クラス コンストラクター内から呼び出されるOverride 。
  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 に答える
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 に答える
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

最近、ホストヘッダーを使用して、使用する必要があるconnectionStringNameを決定するカスタム構成を追加することで、そのようなことを行いました。

EF5 には、この名前を処理できるコンストラクターがあります。

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