2016-07-04 12 views
0

私はリボンとContentControlを保持するMainWindowを持つシンプルなC#MVVM WPFアプリケーションを用意しています。リボンアクションに基づいて、私は異なるUserControlsに切り替えてContentControlに表示します。 Entity Framework 6繰り返しの読み込みを避ける

はViewModelに内部のデータをロードするには、私は基本的にこれを行う:今 Loadメソッドが毎回呼ばれ
public class ProductsViewModel : BaseViewModel 
{ 
    public CollectionViewSource ProductsCollection { get; private set; } 
    private MyDataContext _ctx; 

    public ProductsViewModel() 
    { 
     ProductsCollection = new CollectionViewSource(); 
     _ctx = new MyDataContext(); 

     Load() 
    } 

    public void Load() 
    { 
     _ctx.Products.Load(); 
     ProductsCollection.Source = _ctx.Products.Local; 
    } 
} 

iはDataContextのように、このビューモデルとユーザーコントロールを示しています。

これを避ける方法はありますか? _ctx.Products.Load()が(11Kレコードの)重大な時間を要し、ObservableCollectionに_ctx.Products.Localでアクセスするのは非常に遅いためです。

すべてのUserControlのDataContextと、データベースとの同期でUIを維持するのが簡単なので、.Local Collectionの作業が好きです。しかし、より良いアプローチがある場合は、私に知らせてください。

私はEFとMVVM/WPFで非常に新しいので、すべての助けが大変ありがとうございます!

P.S:あなたは、これは「簡単なのデスクトップアプリケーションで述べたので、私は、SQL Serverの2014

+0

最初の質問です:なぜすべてのレコードを読み込みますか?私は、ユーザーがレコードを編集することができ、データグリッドを、持っている、と私の知る限り、WPFのDataGridでページングを実装するための簡単な解決策は、少なくとも存在しないため –

+0

は... – CeOnSql

+0

は、パフォーマンスを向上させるには、いくつかの方法がありますが、それは、アプリケーションのロジックに依存します。あなたのデータ検索にいくつかのフィルタを追加することができます。また、(それ静的/シングルトンのいくつかの種類作り、例えば代わり​​に、ユーザーコントロールのページのルートに)高いレベルでのデータ検索を置くことができます。ちょっと別の詳細:DbContext Setインスタンスで.Load()メソッドを呼び出す必要はないと思います。また、Entity Frameworkの設定(遅延ロードなど) – hbulens

答えて

0

でまず、データベースのEF 6を使用していますが、1人のユーザーがデータを編集するアプリを作成している可能性があります。それがあなたの意図なら、MVVMの代替案を提案することができます。 MVVMは非常に優れたアーキテクチャーですが、シンプルなデスクトップアプリケーションでは過剰に使用される可能性があります。ここで

は、まずEFデータベースを使用してシングルユーザーのアプリのために非常にうまく機能し、私が使用して代替ソリューションです:

は、メインウィンドウのための単一DBContextを使用し、すべてのUserControls、およびシングル「保存」ボタンを持っています/すべての変更をコミットするメニュー項目。また、ユーザーが終了して最初に保存を促すときに、変更を確認することもできます。また、オブジェクトにINotifyPropertyChangeObservableCollectionsが実装されている場合、1か所の変更はアプリ内の別の場所にも反映されます。これをアプリケーション全体で利用できるようにするには、シングルトンパターンの使用や静的クラスの作成、パブリック静的メンバーとしての配置など、さまざまな方法があります。次に、すべてのコントロールにこのインスタンスを使用させます。

INotifyPropertyChangeObservableCollectionsを実現するために、次の2つのオプションがありとおり: オプション1)これはINotifyPropertyChangeを実装EntityObjectから継承するオブジェクトを作成しますEntityFramework 4で最初にデータベースを使用して、それを実装します。また、関連はEntityCollectionsとして実装され、AssociationChangedを実装します。これらのすべては、単純な WPFアプリケーションで役に立ちます。データをコントロールに直接バインドすることができます。これは完全に機能的なシングルユーザデスクトップアプリケーションを作成する非常に簡単な方法です。これは私がほとんど毎日使っているアプリでやったことです。

オプション2)最初EF 6 DBと実装が、変更してINotifyPropertyChangeObservableCollectionsをサポートします。既定では、EF 6は既定ではほとんど観察できないPOCO(普通の古いCLRオブジェクト)を作成します。ただし、これらを実装するには、作成プロセスを変更することができます。これに対するKEYは、{yourmodelname}.ttファイルを変更することによって行われるT4テンプレートを変更することです。私は最近、EF4ベースのアプリケーションでこれを行い、うまくいきました。ここではそれを行うための手順は次のとおりです。

はそれのバックアップを作成し、あなたの{modelname}.ttファイルを検索します。

INotifyPropertyChangeを追加する.ttを更新します。 を参照してください:naskewのここ答え:Using INotifyPropertyChanged with Entity Framework 6 DbContext GeneratorObservableCollections代わりのHashSetsを使用するように.ttを更新

: 参照:コーリャ愛のプラハEvdokimovの答えここに:How can I change an Entity Framework ICollection to be an ObservableCollection?、 1つの変更の場合:.ttNavigationProperty機能では、 .ttを変更した後ICollection

ObservableCollectionに変更し、右 .ttファイルをクリックし、ファイル名を指定して実行カスタムツールを選択します。これが完了すると
、あなたの作成したEFクラスは INotifyPropertyChangeを実装し、団体のための ObservableCollectionsを持つことになります。 WPFコントロールに DataBindingを実装する準備が整っているはずです。基礎となるモデルは、私はここにあなたのための私の .ttファイルを貼り付けたい INotifyPropertyChangeObservableCollections

を使用していますので、1 UserControlの変更は、アプリケーションの別の場所で反映されているが、それはあまりにも大きかったです。

関連する問題