2016-09-28 1 views
1

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

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

私の最初の考えは、各ビューに対して1つのインスタンスを作成することでした。私はアイテムのリストを管理するためのItemsViewModelを作成Itemクラス

  • を持って

    • 次のシナリオを想像してみてください。このviewModelでは、DbContextのプロパティを追加します

    • ユーザーが項目をダブルクリックすると、その項目がItemViewModelに関連付けられた詳細ビューに表示されます。このビューモデルには、私のDbContextのインスタンスもあります。

    、ユーザが詳細ビュー終了:彼は保存した場合、彼がキャンセルした場合、私はリスト

  • のDbContextを更新し、リストが
  • を更新する必要はありません、

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

    答えて

    5

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

    ここでは、EFチームからです:

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

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

    EFコアを使用しているため、AutofacをDI APIとして使用できます。

    あなたのために良い記事:How to work with DbContext

    それはEntity Frameworkの、のIoCコンテナと依存性注入とジェネリックリポジトリパターンに基づいてデカップリング、ユニット・テスト可能な、N層アーキテクチャを実装する方法を説明します別の良い記事。はい、この記事はMVC用です。しかし、あなたはこの記事を使ってこのパターンの良い知識を得ることができます。

    Generic Repository and Unit of Work Pattern, Entity Framework,Autofac

    +0

    は明確にするために、私は、WPFアプリケーションが、UWP 1の研究開発をしていません。しかし、これは私が推測する彼女の何も変わらない。 –

    +0

    はい、そうです。違いはありません。同じパターンをそこにも適用することができます:) – Sampath

    1

    を聴くための記事やその上のSOの質問のトンがありますが、多くのありがとう、「DbContext寿命デスクトップアプリケーション」のためのgoogle。また、このMSDN誌は役に立つかもしれませんが、nHibernateのケースについて議論していますが、ルールはまったく同じです。

    Data Access - Building a Desktop To-Do Application with NHibernate

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

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

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

    、これもそこにコメントされています

    [...]デスクトップアプリケーションと共通の悪い習慣が全体のための単一のグローバルセッションを持つことです応用。

    であり、理由は後述する。

    関連する問題