12

dbContext の有効期間をセッションの有効期間に結び付けて、たとえば、dbcontext のミューテーションのグループの変更を複数のリクエストでコミットまたは破棄できるようにしたいと考えています。

これを達成するための他の(より良い?)方法はありますか?いいえの場合、コンテキストを作成および破棄するための適切なメカニズムは何でしょうか? セッション終了時にクリーンアップを行う静的ハッシュテーブルについて考えていますが、おそらくすべて間違っています。また、複数のリクエストに対して作業を行う必要があるコンテキストのみを保持し、残りはアクションごとに保持するというアイデアについても考えています。何かアドバイス?

4

5 に答える 5

6

IoC (制御の反転)コンテナーを使用して、次の手順でStructureMapなどの DBContext の有効期間を管理できます。

  1. MVC 4 の nuget パッケージをインストールします: http://nuget.org/packages/StructureMap.MVC4

  2. クイック スタートを読む: http://docs.structuremap.net/QuickStart.htm

  3. DBContext のスコープを設定します: http://docs.structuremap.net/Scoping.htm

また、リポジトリ パターンと作業単位パターンの組み合わせを使用して、複数の要求で dbcontext のミューテーション グループの変更をコミットまたは破棄することもできます。

于 2012-11-03T11:33:44.730 に答える
4

この質問は、次の SO 投稿でかなりエレガントに回答されています。

StructureMap CacheBy InstanceScope.HttpSession が機能しない

基本的に、魔法は次のコードから来ています(あなたの質問と の新しい構文に適応していますStructureMap):

ObjectFactory.Initialize(factory => {
    factory.For<MyContext>()
           .CacheBy(InstanceScope.HttpSession)
           .Use(new MyContext(_myConnectionString));
});

次に、コントローラーで、次を使用してオブジェクトのインスタンスを作成するだけです。

var db = ObjectFactory.GetInstance<MyContext>();

IoC (制御の反転) セットアップによってStructureMap、インスタンスのスコープが に設定さHttpSessionれているため、セッションが同じである限り、毎回同じコンテキストを取得する必要があります。

ただしDbContext、特にオブジェクトの場合、これは通常非常に悪い考えであることに注意してください。状態追跡オブジェクトをステートレス環境と混在させているため、不正なトランザクションまたはオブジェクトが無効な状態になる可能性があります。奇妙な状態にあると、セッションを更新するまで、それ以上のデータベース呼び出しを実行できなくなる可能性があります。

DbContextオブジェクトは通常、非常に軽量で使い捨てになるように設計されています。それらをスコープから外して、基本的には使い終わったらすぐに死ぬのはまったく問題ありません。

于 2012-11-06T00:21:07.993 に答える
2

セッションで DbContext をライブにするのは良い考えではありません。

  1. より多くのリクエストがあると、データの一部をDBからコンテキストにロードし、コンテキストをより大きくします。つまり、メモリの問題です。

  2. また、別のユーザー (別のセッション) が既にコンテキストにロードしたデータを更新した可能性があるため、コンテキスト内の要求ごとに DbContet と比較して更新されたデータはありません。

要求ごとの Entity Framework DbContext のキャッシュ

そして、あなたのオプションのためにこれを読んでください、

Asp.Net MVC とセッション

于 2012-10-25T12:04:31.423 に答える
1

通常、このシナリオでは、変更を一時ストア (セッション、Cookie、データベースなど) に保持する必要があります。結果を保存するか、新しいデータを表示する必要がある場合は、古いデータと変更を取得して新しいオブジェクトを作成します。変更は、新しいオブジェクトまたは一連のアクションとして保存できます。変更を適用するときは注意してください。データの競合が発生する可能性があります。もちろん、 Context\Request を使用します

于 2012-11-01T12:15:30.550 に答える
0

理論的には、各コントローラーでアクセスできるセッション ディクショナリにコンテキストを格納できます。ただし、保存時と取得時ではスレッドが異なるため、スレッドの問題が発生する可能性があります。コンテキストがスレッド静的変数を使用しない場合、これは機能する可能性があります (ただし、これについてはよくわかりません)。いずれにせよ、これは悪い設計です...Webでは誰もこれを行いません...なぜコンテキストを保存したいのですか? 後続の http リクエストで安価に再作成できます。プロパティの変更を追跡する必要がある場合は、Web に適した他の方法があります。

于 2012-10-30T23:20:04.150 に答える