7

私はEntityFrameworkを学び、各ViewModelがデータアクセス用のDbContextと連携するMVVMアプリで使用しています。免責事項:実際のアプリケーションでは、ViewModelがデータアクセス層と直接対話してはならないことを私は知っています。

各ViewModelは、モデル自体との関係を維持することによってビューの状態を監視および操作するために存在することを考えると、複数のDbContextオブジェクトをスピンアップすることの意味について疑問に思い始めました。また、DBContextのようなものをシングルトンとして残すのが最適かどうかを考え始めました。すぐに答えは「いいえ」でした。したがって、(複数のViewModelの場合のように)使用ごとにインスタンスを作成することがコンセンサスである場合、これを使用することで発生する可能性のある問題について誰もが言及している場所はまだわかりません。

詳細に説明すると、2つのViewModelがあり、それぞれにContext(TestContextから継承DbContext)を作成して、各ViewModelの存続期間中にデータアクセスアクティビティを維持するとします。

public class MainWindowViewModel : ViewModelBase
{
    private TestContext db = new TestContext();
    ... other code follows (properties methods etc...)...
}

public class TestViewModel: ViewModelBase
{
    private TestContext db = new TestContext();
    ... other code follows (properties methods etc...)...
}

各クラスにコンテキストを使用してそれを消費できるという落とし穴はありますか?

私を悩ませているそのような考えの1つは、一方のViewModelが他方よりも最新のデータを持ち、そのコンテキストがより「最新」であるように、どちらかのコンテキストを他方と同期させないことが可能かどうかです。このようなことを知りたいです。

ありがとう。

編集

コーディングしている状況に固有のものであるため、すべての状況を発見/カバーすることは望んでいません。私は、この主題に慣れていないことに気付いていない「事前の」または明らかな危険があるかどうかを知りたいだけです。

4

1 に答える 1

4

Entity Frameworkは、拡張機能としてデザインパターンDbContextをサポートします。UnitOfWork論理的な「トランザクション」を分離しておくという考え方です。このため、通常、アプリケーションの各部分または機能で独自のDbContextインスタンスを処理する必要があります。

あなたがそれについて考えることができる方法は、それがDbContextデータベースから引き出したもののローカルコピーを保持し、ユーザーによってローカルデータに加えられたすべての変更を追跡するということです。準備ができたら、必要な変更を一度にデータベースにプッシュするように指示します。

落とし穴と危険についてのあなたの質問のために; Entity Frameworkは、デフォルトで楽観的並行性と呼ばれるものを使用します。これは、ローカルの変更をデータベースに保存するときに、同時実行性がまったくチェックされないことを意味します。ローカルのDbContextにあるものはすべて、アプリケーション内の別のユーザーまたは別のコンテキストが変更したかどうかに関係なく、データベースに送り返されます。これと動作を変更する方法を説明する優れた記事は、http: //msdn.microsoft.com/en-us/library/bb738618.aspxにあります。

于 2013-03-01T01:34:16.883 に答える