ASP.NET Core OnModelすべてのリクエストで起動する強制

asp.net-core-mvc c# entity-framework-core sql-server

質問

ASP.NET Core OnModelすべてのリクエストで起動する強制

私はASP.NET Core(1.1.0)とSQL Serverデータベースを持っています。ログインページには、企業名の入った選択ボックスがあるフォームがあります。

例えば:

  • 会社1
  • 会社2

ユーザーが最初の「会社1」を選択した場合、会社の接頭辞を持つすべての表の名前を変更する必要があります。

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    foreach (var entity in builder.Model.GetEntityTypes())
    {
       entity.Relational().TableName = "Company 1" + entity.DisplayName();
    }
}

それは完璧に機能していますが、ユーザーが間違った会社を選択したり、システムからログアウトして別の会社にログインしたりすると、OnModelCreatingが再び呼び出されることはなく、dbContextを再設定することはできません。

すべての要求に対してOnModelCreatingを強制することは可能ですか?

または、dbContextの初期化後にテーブル名を変更しますか?

ありがとう!

人気のある回答

それは間違った方法です。 OnModelCreatingは、EFがクラスからモデルを作成または記述するときに実行されます。リレーションの検証、実際のDBとの比較(そして、マイグレーションが必要かどうかの確認など)など、多くのリフレクションとタイプの操作がここにあります。あなたは本当にすべての要求にこのすべてのものを実行する必要がありますか?

要求ごとにDbContextを再作成しないでください。いくつかのDbContextを作成し、要求の開始時にそれらのうちの1つ(1回作成!)を選択します。

例えば:

主なDbContext抽象を作成し、必要な数だけCompanyXDbContextを作成します。それらはすべて基本クラスから継承し、単純なテーブル接頭辞を(ctor内で)提供します。

あなたのコードのどこでも、DbContextが必要なときはDIから抽象/基底クラスを求めます。

Startupに抽象DbContextをファクトリメソッドで登録し、現在のRequest変数/パラメータに応じて実際のものを選択したり、現在のリクエストに基づいて正しいインスタンスを作成するカスタムミドルウェアを作成したりします。


CompanyXがたくさんある場合、事前にコーディングされた多くのCompanyXDbContextクラスの代わりに何か別のものが必要かもしれません。ランタイムクラスを作成するものがあるかもしれないし、ジェネリックかもしれません...しかし、主なアイデアは変わりません。すべてのリクエスト。



Related

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