質問

私はEntityFrameworkを使って最初のアプリケーションを作成しています。私はEntity Framework CoreとMVVMLightを使用しています。

私はDbContext子孫クラスを作成しました。私はいつこのDbContextをインスタンス化するのか知りたいです。

私の最初の考えは、各ビューに対して1つのインスタンスを作成することでした。

以下のシナリオを想像してみてください。

  • 私はItemクラスを持っています
  • アイテムのリストを管理するItemsViewModelを作成します。このviewModelでは、DbContextのプロパティを追加します
  • ユーザーが項目をダブルクリックすると、ItemViewModelに関連付けられた詳細ビューに表示されます。このビューモデルには、私のDbContextのインスタンスもあります。

ユーザーが詳細ビューを終了すると、

  • 彼が保存した場合は、リストのDbContextを更新します
  • 彼がキャンセルした場合、リストを更新する必要はありません

これは正しいことですか?私はどこか1つだけDbContextのインスタンスを持つ必要があります読んだ。しかし、この場合、ディテール・ビューのすべての変更は、ディテール・ビューがキャンセルされた場合でもリスト・ビューに伝播されます。

聞いてみるとたくさんの

受け入れられた回答

WPFアプリケーションを開発しているので、フォームごとにコンテキストインスタンスを使用できます。

ここはEFチームのものです:

Windows Presentation Foundation(WPF)またはWindowsフォームを使用する場合は、フォームごとにコンテキストインスタンスを使用します。コンテキストによって提供される変更追跡機能を使用できます。

Dependency Injection(DI)を使用してリポジトリパターンを使用することをお勧めします。インスタンス化について心配する必要はなく、dbcontextを処分する必要はありません。それらは自動です。

したがって、EFコアを使用している場合は、DI APIとしてAutofacを使用できます。

良い記事: DbContextの使い方

Entity Framework、IoC Container、およびDependency Injectionを使用した汎用リポジトリパターンに基づいて、デカップリングされた、ユニットテスト可能なN層アーキテクチャを実装する方法について説明しているもう1つの良い記事です。この記事はMVC用です。しかし、あなたはこの記事を使ってこのパターンの良い知識を得ることができます。

汎用リポジトリと作業単位のパターン、エンティティフレームワーク、オートファック


人気のある回答

それにはたくさんの記事とSOの質問があります.DbContextの生涯デスクトップアプリケーションです。また、このMSDN誌は役に立つかもしれませんが、nHibernateのケースについて議論していますが、ルールはまったく同じです。

データアクセス - NHibernateを使用したデスクトップTo-Doアプリケーションの構築

デスクトップアプリケーションの推奨される方法は、アプリケーションの各フォームが独自のセッションを持つように、フォームごとにセッションを使用することです。各フォームは、通常、ユーザーが実行したい別の作業を表します。したがって、セッションの有効期間とフォームの有効期間を一致させることは、実際にはうまく機能します。アプリケーションのフォームを閉じると、セッションも破棄されるため、メモリーリークの問題はなくなりました。これにより、セッションによってロードされたすべてのエンティティがガベージコレクタ(GC)のレクラメーション対象になります。

フォームごとに1つのセッションを優先する理由はいくつかあります。 NHibernateの変更追跡を利用することができるので、トランザクションをコミットするときにデータベースへのすべての変更がフラッシュされます。また、異なるフォーム間に隔離障壁を作成するので、他のフォームに表示されている他のエンティティへの変更を心配することなく、単一のエンティティに変更をコミットできます。

セッションライフタイムを管理するこのスタイルはフォームごとのセッションとして記述されますが、実際にはプレゼンターごとにセッションを管理するのが普通です。

"1インスタンスのDbContext"に関しては、これもコメントされています:

[...]デスクトップアプリケーションの一般的な悪い習慣は、アプリケーション全体に対して単一のグローバルセッションを持つことです。

理由は後述する。



Related

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