Entity Framework 7 / MVC 6で接続文字列を動的に(要求ごとに)変更する

asp.net-core asp.net-core-mvc azure-sql-database entity-framework-core

質問

MVC 6アプリケーションにアクセスしている人に応じて、別のデータベース(物理ファイルだけで同じスキーマ)に接続する必要のあるアプリケーションがあります。つまり、Webアプリケーションの各顧客は、SQLデータベース(Azure上で異なるパフォーマンス、価格水準など)でデータを分離しますが、それらのデータベースはすべて同じリレーショナルスキーマを共有します。もちろん、Entity Frameworkコンテキストクラス。

var cadConexion = @"Server=(localdb)\mssqllocaldb;Database=DBforCustomer1;Trusted_Connection=True;";
services.AddEntityFramework().AddSqlServer().AddDbContext<DAL.ContextoBD>(options => options.UseSqlServer(cadConexion));

問題は、私がこのようにサービスを登録すると、具体的な顧客の具体的なデータベースに結びつけていることです。ミドルウェアの実行開始時に後者を変更できるかどうかはわかりません(これは、ドアで誰が鳴っているのかを知ることができます)。

私は、接続文字列をパラメータとして渡すデータベースコンテキストを構築することができますが、これは、すべての要求に対して実行時に(実行時に)データベースコンテキストを作成する必要があることを意味します。または悪い習慣。さらに、私はこのように私はコントローラにそれを注入するためのサービスとしてデータベースコンテキストを登録することはできません...

このための正しいアプローチは何ですか?誰も生産に取り組んでいる同様の構成を持っていますか?

前もって感謝します

受け入れられた回答

まず、リクエストごとに接続文字列を交換することはお勧めしません。

しかし、それは問題ではありません。あなたはこれを行うことができます。 DbContextに新しい接続文字列を渡す必要があります。

.AddDbContextは接続文字列を依存関係注入コンテナにキャッシュするので、DIを使用してこのシナリオを動作させることはできません。代わりに、自分でDbContextをインスタンス化し、新しい接続文字列を渡す必要があります。


人気のある回答

私は自分自身の質問に答えないことを好みましたが、私はインターネット上での長い深い研究の後に、同様の問題を持つ人に指導を提供しなければならないと感じています。かなり面倒です...

私は最終的に、(具体的にはサービスとしてのソフトウェア)SaaSのために、この具体的な問題に取り組むことを目指したMicrosoftのツールのセットである、「Elastic Database Tools」と呼ばれるAzureの(最近の)機能とAPIを使用しました。シナリオ(私のように)。

ここから始めるには良いリンクがあります:

https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-scale-get-started/

あなたのプロジェクトで幸運を祈る!



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ