2017-05-26 8 views
0
  • ユニークなスキーマを持つ1つのマスタDBコンテキストがあります。
  • 私は同じスキーマを持ち、同じサーバー上に存在する100以上のデータベースを持っています。

ユーザーがマスターDBに対して認証します。認証後、ユーザーに応じて、残りのクエリは、100以上の同一のスキーマDBのリストから特定のDBをターゲットにします。EFコアは、多数の潜在的な接続文字列を含むdbcontextを挿入します。

ASP .NET Core + EF Coreでは、ポストインジェクションの接続文字列を指定できるファクトリまたはコンテキストを登録するにはどうすればよいですか?(認証されたユーザーから提供された値に基づいて)

私はIDbContextFactory<MyDbContext>といくつかの他のオプションで遊んでいますが、コンテキストが注入された後に接続文字列または接続プロパティを指定する明確な例は見つからないようです。

答えて

2

独自の工場を作成するだけです。

public interface ITentantDbContextFactory<T> 
{ 
    T Create(string tenantId); 
} 

public class AppTenantDbContextFactory : ITenantDbContextFactory<AppDbContext> 
{ 
    public AppDbContext Create(string tenantId) 
    { 
     // do some validations on tenantId to prevent users from 
     // injecting arbitrary strings into the connection string 
     var builder = new DbContextOptionsBuilder<AppDbContext>(); 

     // you can also load it from an injected option class 
     builder.UseSqlServer($"Server=MYSERVERHERE;Database={tenantId};Trusted_Connection=True;"); 

     return new AppDbContext(builder.Options); 
    } 
} 

次に、必要な場所に工場を注入します。欠点は、DbContextのライブ時間を管理して処分する必要があることです。

また、あなたの工場にIDisposableインタフェースを実装し、参照のリストを保持し、Dispose()メソッドが呼び出されたときに、あなたの工場が一時的なものとして登録またはスコープされている場合、リクエストの終了時に行われますどの(これらを処分することができます。

Dictionary<string, AppDbContext>に複数のDbContextにアクセスしてtenantId(またはプロジェクトで呼び出されたもの)をキーとして使用する必要がある場合は、factory.Create("tenantA")を呼び出すときに同じインスタンスを取得する必要がある場合は、Unit Unit of Workパターンが役立ちます。次にSaveChangesメソッドを追加します。SaveChangesのインスタンス化されたものがすべてAppDbContextインスタンス

関連する問題