DataSource for Entity Framework for WinForms
クライアントデータキャッシュの能力
設計時の機能 > クライアントデータキャッシュの能力

サーバー側のフィルタ処理」の例は、C1DataSource により、Entity Framework をこれまでより簡単かつ便利にアプリケーションで使用できるようになったことを示しています。これは、C1DataSource の主要な機能であるクライアント側のデータキャッシュによって実現されました。また、いくつかの重要な機能が強化され、アプリケーションコードをはるかに容易に記述できるようになりました。

最初に、「サーバー側のフィルタ処理」の例で見ることができるパフォーマンスの向上について説明します。ユーザーがカテゴリを切り替えると、そのカテゴリに関連する製品がグリッドにロードされます。あるカテゴリを初めて選択すると、関連データが取得されるまでにわずかな遅延が発生します。その後、同じカテゴリを選択すると、データはほぼ即座に取得されます。なぜでしょうか。データが、サーバーからではなく、クライアントメモリのデータキャッシュ(EntityDataCache)から取得されるためです。

メモ: 実際の EntityDataCache の機能はもっと高度です。クエリーはまったく同じではないが、他のクエリーの結果として既にキャッシュされているデータから結果を返すことができるといった複雑な状況でも、サーバーとのやり取りを回避できるという判断を行うことができます。

単一のマシンで作業し、ネットワークとのやり取りが必要ないなら、このパフォーマンスの向上は実感されないかもしれません。しかし、現実には、ユーザーアクションのたびにサーバーを呼び出すような反応が遅いアプリケーションと、遅延のない快適なインタフェースとの差は歴然です。

2つめの重要な改良点はメモリ管理です。これまでの説明や実際に目にしたことから、EntityDataCache は、存在する間ずっとデータを蓄積し続けているように思われるかもしれません。もしそうなら、すぐに深刻なパフォーマンスの低下を見ることになるはずです。実際の EntityDataCache は、保存されているデータを常に監視し、データが不要になるとそれを解放して、同時にセルフクレンジング処理を実行しています。これらの処理はすべて、何もコードを追加しなくても実行されます。また、さらに重要なことは、データの整合性が常に維持されるという点です。他のデータによって必要とされるデータは解放されません。また、何らかの変更が加えられたデータは、保存されるまで解放されません。この処理はパフォーマンスにも影響します。メモリ内の不要なオブジェクトを破棄すればパフォーマンスが向上し、反対に、古くなったデータがメモリに大量に保存されていればパフォーマンスが低下します。

C1DataSource では、クライアントキャッシュのお陰で複数のデータコンテキストを作成する必要がなくなり、コンテキスト管理がシンプルになったということを前に説明しました。ここでは、EntityDataCache の詳細と、その知識をさらに活用する方法について説明します。

EntityDataCache は本質的にコンテキストです。C1DataSource の名前空間において、キャッシュは C1.Data.Entities.EntityClientCache クラスであり、その ObjectContext プロパティを通して ObjectContext に1対1で対応します。C1DataSource コンポーネントを使用している場合は、キャッシュとその基底の ObjectContext がどちらも自動的に作成されます。ただし、必要な場合は、コードでこれらを明示的に作成し、C1DataSource.ClientCache プロパティを設定することができます。

クライアント側のキャッシュによってどのようにアプリケーションコードが簡略化されるかを見るために、変更データを保存する機能を Server-Side Filtering プロジェクトに追加してみます。

  1. ボタン btnSaveChanges をフォームに追加し、このコードのハンドラを追加します。
    コードのコピー
    Private Sub btnSaveChanges_Click(sender As System.Object, e As System.EventArgs)
        C1DataSource1.ClientCache.SaveChanges()
    End Sub
    
    コードのコピー
    private void btnSaveChanges_Click(object sender, EventArgs e)
       {
         c1DataSource1.ClientCache.SaveChanges();
       }
    
  2. アプリケーションを保存、ビルド、および実行します。
    • カテゴリを選択し、グリッドで製品情報に変更を加えます。
    • 2つ目のカテゴリ(必要に応じて3つ目も)を選択し、グリッドで製品詳細に再度変更を加えます。
    • 追加したボタンをクリックしてアプリケーションを閉じます。再度アプリケーションを開き、前の手順と同じカテゴリを選択します。
    • 変更がどのように保存されているかを確認します。C1DataSource では、EntityDataCache により、別のカテゴリを選択するたびに変更を保存しなくても、複数のカテゴリの製品の詳細を変更することができます。C1DataSource なしでこのような目的を達成するには、大量のコードを記述するか、複数のカテゴリのエンティティ(製品詳細)を同じコンテキストに保存する必要があります。メモリが解放されないため、メモリが浪費され、メモリリークの原因になります。C1DataSource では、このすべての処理が簡略化されると共に、メモリ消費量とパフォーマンスが最適化されます。

クライアント側のキャッシュは、ほかにもクライアント側のクエリーなどの C1DataSource の重要な機能を提供しています。特に、ライブビューは重要です。ライブビュー は、複雑なアプリケーションコードの大部分を単純なデータ連結に置き換えることができる機能です。これについては、後のセクションで説明します。