DataSource for Entity Framework for WinForms
簡単な連結
設計時の機能 > 簡単な連結

最初に、Visual Studio で新しい Windows フォームプロジェクトを作成します。

  1. Visual Studio で、[ファイル]→[新規作成]→[プロジェクト]を選択します。
  2. [Windows フォームアプリケーション]テンプレートを選択し、[OK]をクリックします。

次に、Northwind データベースに基づいてエンティティデータモデルを追加します。このモデルにより、アプリケーション全体のデータが提供されます。

  1. ソリューションエクスプローラーで、プロジェクト名を右クリックし、[追加]→[新しい項目]を選択します。
  2. [データ]カテゴリで[ADO.NET データモデル]項目を選択し、[追加]をクリックします。
  3. エンティティデータモデルウィザードを使用して、使用するデータベースを選択します。この例では、WinForms\C1DataSource\Data フォルダにインストールされている "NORTHWND.mdf" を使用します。
  4. ソリューションエクスプローラーで、model1.edmx の横にあるモードを展開します。
  5. Model1.Context.tt ファイルと Model1.tt ファイルを削除します。
  6. モデル図を右クリックし、コンテキストメニューから[コード生成項目の追加]を選択します。[コード生成項目の追加]ダイアログボックスで、[ComponentOne EF 6.x DbContext Generator]を選択します。
    メモ:DataSource for Entity Framework をインストールすると、C1DataSource がサポートする各バージョンの Visual Studio に ComponentOne EF6.x DBContext コード生成テンプレートが追加されます。これらのテンプレートを使用すると、作成する DBContext モデルによって INotifyPropertyChanged をサポートするエンティティが提供されます。

ここでプロジェクトをビルドすると、新しいエンティティデータモデルクラスが生成され、プロジェクト全体で使用可能になります。

次に、C1DataSource コンポーネントをアプリケーションに追加し、それをエンティティデータモデルに接続します。

  1. C1DataSource コンポーネントをツールボックスからフォームにドラッグします。これは非ビジュアルコンポーネントです。そのため、フォーム自体にではなく、フォーム領域の下のトレイに表示されます。
  2. 新しいコンポーネントを選択し、[表示]→[プロパティウィンドウ]を選択します。
  3. プロパティウィンドウで、ContextType プロパティを、使用するオブジェクトコンテキストのタイプに設定します。この例では、"AppName.NORTHWINDEntities" のようなオプションが1つだけドロップダウンリストに表示されます。

この時点で、C1DataSource により、アプリケーションレベルのオブジェクト(EntityDataCache)が作成されています。このオブジェクトは、Northwind データベースを表し、アプリケーションスコープを持ちます。他のフォームに追加される C1DataSource オブジェクトも、この同じオブジェクトを共有します。同じアプリケーションに属する C1DataSource オブジェクトは、すべて同じ ObjectContext を共有します。

この統合オブジェクトコンテキストは、C1DataSource の大きな特長の1つです。これがない場合は、アプリケーション全体で複数のオブジェクトコンテキストを作成し、それぞれを他のオブジェクトコンテキストや基底のデータベースと個別に同期させる必要があります。これは簡単な仕事ではなく、エラーがあればデータの整合性が損なわれます。統合オブジェクトコンテキストは、この仕事を透過的に実行します。データを効率よくキャッシュし、安全かつ一貫性がある方法ですべてのビューにデータを提供します。

これで、C1DataSourceObjectContext が作成されたので、次にその ViewSources コレクションを通してアプリケーションに公開するエンティティセットを指定します。ADO.NET に精通している場合は、C1DataSourceDataSet に、ViewSources コレクションが DataView オブジェクトに相当すると考えることができます。

C1DataSource のプロパティから ViewSourcesCollection プロパティを見つけ、そのエディタダイアログを開きます。[追加]をクリックし、[EntitySetName]ドロップダウンリストから Products を選択します。

この簡単な例で実際に必要なエンティティセットは Products だけです。ただし、引き続き同じ方法で、この C1DataSource 内に ViewSource を作成してもかまいません。たとえば、Categories エンティティセットに基づいて ViewSource を作成すると、Categories と Products 間のマスター/詳細関係を表示するためのフォームを作成することができます。反対に、必要になるすべての ViewSource を1つの C1DataSource で定義する必要はありません。必要な ViewSource ごとに別の C1DataSource を作成することができます。必要なことは、使用する C1DataSource コンポーネントで同じ ContextType を利用することだけです。

実際のところ、クライアントに返したいデータは、常に、データベースに含まれるデータのほんの一部です。そうすることで、クライアントやネットワークに過大な負荷がかかることを回避でき、エンドユーザーが実行しているタスクに関係するデータだけを提示することができます。従来は、コード(通常は SQL クエリー)を作成してデータベースに対して実行することで、この目的を達成していました。C1DataSource を使用すると、サーバー側のフィルタをプロパティ設定として指定することで、コードを記述することなく、デザインサーフェスを利用してこの目的を達成することができます。

ViewSourceCollection エディタで、FilterDescriptor コレクションエディタを開きます。フィルタディスクリプタを追加し、サーバー側でフィルタ処理するプロパティの名前とその値を入力します。複数のプロパティをフィルタ処理する場合は、フィルタディスクリプタを追加します。

同じ方法で、取得したデータをソートする SortDescriptor を追加することができます。

C1DataSource を設定したら、フォームにグリッドコントロールを追加します。DataGridViewC1FlexGrid など、使い慣れた任意のグリッドを使用することができます。グリッドの C1DataSource プロパティを C1DataSource の名前に設定し、その DataMember プロパティを Products に設定します。C1DataSource に名前を付けていない場合は、c1DataSource1 を指定します。実際の DataMember プロパティのドロップダウンリストには、C1DataSource に対して定義したすべての ViewSource(またはエンティティセット)が表示されます。

この時点で、グリッドに、Product タイプのすべてのフィールドに対応する列が自動的に生成されます。また、ほとんどのグリッドでは、組み込みのデザイナを使用して、これらの列とレイアウトをカスタマイズすることができます。グリッドのレイアウトが完成したら、アプリケーションを保存、ビルド、および実行します。データが自動的にロードされ、目的のとおり、項目をソート、追加、および削除できることを確認してください。2つの項目(C1DatSource とデータグリッド)をフォームに追加し、いくつかのプロパティを設定するだけで、作業が完了しました。1行もコードを記述する必要はありませんでした。

引き続き、このフォームに他のコントロールを追加して、それらを Products コレクションの特定の項目に連結することができます。その具体例として、フォームに1つの TextBox コントロールを追加します。次に示すように、プロパティウィンドウで DataBindings セクションを展開し、その Text プロパティを ProductName に連結します。

アプリケーションを再度保存、ビルド、および実行します。今回は、グリッドで現在選択されている製品の名前が、フォームに追加した TextBox に表示されます。一方のコントロールで製品名を編集すると、その変更がもう一方のコントロールにすぐに反映されます。