複数のエンティティコンテキストを持つ

asp.net-core asp.net-core-mvc entity-framework-core

質問

私がアイデンティティ・フレームワークdbContextを拡張して自分自身をビルドしたとしましょう。私は、 dbContextを注入して現在のApplicationUser関連するエンティティをフェッチする認証済みのコントローラを持っていApplicationUser 。エンティティ・フレームワークは、循環参照の

私たちは循環参照をシリアル化したくありません。

だから我々は新しい作成dbContext新しいistantiate方法でdbcontextし、関係のないエンティティを照会、これは動作します。しかし、 これはテスト可能ではありません。私たちのコントローラがdbContextに厳密に依存することはdbContextありません。

したがって、コンストラクタに2番目のパラメータを追加すると残念ながら、これによってシステムは同じdbContext 2回注入しますが、それほど有用ではありません。

私たちは、クラスを作成してみましたfakeDbContextから継承dbContextやサービスを追加し、それを使用してます今、私たちは潜在的に移行と設定し、エラーを発生させることができる2つのdbcontextを得たが ...

新しいMVC6でこれを行う正しい方法は何ですか?

編集...

私のコントローラがIEnumerable<dbContext>必要とする場合、そのタイプのサービスとして登録されているすべてのオブジェクトを取得するので、サービス登録エリアにdbContextを追加するstartup.csの部分を倍増するだけです。 ..

ここでの欠点は、私は1つが処女であることを知らないということです、それは登録の順番になるように見えますが、これが変わるなら、私は手がかりがありません。

2を編集...

私が作成したTransientDbService服用だけファクトリメソッド持つクラスIserviceProviderそれを構築するためのオプションを得るためにそれを使用し、 dbContextし、それを公開します。私はトランジェントとしてそれを登録しました、そして、コントローラで私はこのサービスタイプを必要とします。

ここで欠点は、私は3番目のdbContextが必要な場合は、私はより多くのコードを記述する必要があります、より多くのコードはエラーを意味し、maintaningです。

3を編集...

2つのdbContextをまったく持っていない。以下の設定では、関係が重くならないようにしています。

Database.ChangeTracker.QueryTrackingBehavior = Microsoft.Data.Entity.QueryTrackingBehavior.NoTracking;

ここでの欠点は、モデルグラフを使用することができず、すべてをより複雑にすることです。

4を編集...

https://github.com/aspnet/DependencyInjection/issues/352

受け入れられた回答

場合によってはトラッキングクエリが役に立たないと思うのは当然ですが、DbContextのインスタンスを複数作成する必要がある場合もあります。

通常は、起動時にAddDbContext<TContext>()メソッドを使用して、要求ごとにコンテキストタイプのインスタンスが作成され、適切なDbContextOptionsとサービスプロバイダが設定されていることを確認します。このパターンから逸脱する必要がある場合、いくつかのオプションがあります。例:

  1. 派生したDbContextクラスにIServiceProviderをとり、それを基本コンストラクタに渡すコンストラクタを含めます。コントローラがIServiceProviderいることを確認します。これを行うと、次のようなDbContextDbContext手動で作成することができます。

    using(var context1 = new MyDbContext(serviceProvider), var context2 = new MyDbContext(serviceProvider)) { ...

  2. 派生したDbContext型のコンストラクタシグネチャを変更する必要がないようにするには、 DbContextActivatorクラス(内部名前空間です)を利用できます。

    using(var context1 = DbContextActivator.CreateInstance<MyDbContext>(serviceProvider), var context2 = DbContextActivator.CreateInstance<MyDbContext>(serviceProvider) {...

注意:起動時にまだAddDbContext<MyDbContext>(options => ...)している場合は、それらのオプションを自動的にサービスプロバイダからAddDbContext<MyDbContext>(options => ...)する必要があります。しかし、 DbContextOptionsをコンストラクタのパラメータとしてインクルードするか、またはそのためのOnConfiguring()メソッドをオーバーライドすることもできます。

私は、使用ブロックで2つの別々のDbContextsを作成する例を挙げていますが、コントローラのコンストラクタに注入される通常の「要求ごとの」DbContextとそれらを混在させることもできます。

現在利用可能なこれらのオプションに加えて、同じリクエストで同じDbContext型の複数のインスタンスを作成する方法に関するその他の改善点を追跡するための新しい問題を作成しました。

https://github.com/aspnet/EntityFramework/issues/4441



Related

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