AdventureWorks データ バインド サンプルでは、Entity Framework を使用するデータ バインドを紹介します。このデータ モデルは、トピック「AdventureWorks Sales Model (EDM)」で定義されています。このアプリケーションでは、SalesOrderHeader に関連付けられている SalesOrderDetail エンティティを表示および変更します。次の図は、SalesOrderDetail エンティティを SalesOrderHeader およびメイン アプリケーション フォーム (バックグラウンド) に追加するダイアログ ボックスを示します。
Entity Framework のデータ バインド
ObjectQuery と Windows フォーム上の DataGridView コントロールのデータ バインドは、数行のコードで実行できます。まず、ObjectQuery を作成します。次に、ObjectQuery を DataGridView の DataSource プロパティに割り当てます。
次の例では、AdventureWorksSalesEntitiesObjectContext によって提供されている ObjectQuery の SalesOrderHeader 1 つを DataGridView コントロールに割り当てています。クエリのパラメータは、テキスト ボックスの SalesOrderHeader の ID
番号を解析することによって作成されます。このパラメータは、ID 番号に一致する単一の SalesOrderHeader を選択するためにクエリの where
句で使用されます。クエリは、DataGridView コントロールの DataSource プロパティに割り当てられます。上の図で、Windows フォームの上部で Sales Order Header というラベルが付いている DataGridView コントロールには、次のコード セグメントによってデータが入力されます。Execute
メソッドを使用すると、クエリは必ず 1 回だけ実行されます。
ObjectParameter parameter =
new ObjectParameter("p", Int32.Parse(textBoxOrderId.Text));
dataGridViewSOHeader.DataSource =
objCtx.SalesOrderHeader.Where(
"it.SalesOrderID == @p",
parameter).Execute(MergeOption.OverwriteChanges);
上の図で、Sales Order Details というラベルが付いている DataGridView コントロールには、次のコード セグメントによってデータが入力されます。SalesOrderHeader には、SalesOrderHeader の SalesOrderDetail プロパティによって指定された関連 SalesOrderDetail エンティティのコレクションがあります。SalesOrderDetail プロパティは、実際は EntityCollection です。このコレクションは、BindingSource コントロールの DataSource プロパティに割り当てることができます。次に、BindingSource が、DateGridView コントロールの DataSource プロパティに割り当てられます。
if(objCtx.SalesOrderHeader.Where(
"it.SalesOrderID == @p", parameter).Any())
{
SalesOrderHeader resultHeader =
objCtx.SalesOrderHeader.Where(
"it.SalesOrderID == @p", parameter).First();
resultHeader.SalesOrderDetail.Load();
dataGridViewOrderDetails.DataSource =
resultHeader.SalesOrderDetail;
}
データ バインド シナリオの変更
Sales Order Detail データ グリッドに表示されている SalesOrderDetail エンティティの 1 つが変更された場合、新しいデータをストレージに保存する前に、データ バインド SalesOrderHeader を更新する必要があります。この処理は、次のコード シーケンスのセル編集ハンドラで行います。
最初に、セルに対する変更が、ObjectContext の SaveChanges メソッドによってストレージに保存されます。次に、ObjectQuery が SalesOrderHeader エンティティを取得します。最後に、ObjectContext メソッドの Refresh が、DataGridControl へのデータ バインドを更新します。ストレージのデータを指定する、Refresh メソッドの RefreshMode.StoreWins パラメータによって、ObjectContext のデータの置き換えが行われることに注意してください。
objCtx.SaveChanges();
ObjectParameter parameter =
new ObjectParameter("p", Int32.Parse(textBox1.Text));
SalesOrderHeader header =
objCtx.SalesOrderHeader.Where(
"it.SalesOrderID == @p", parameter).FirstOrDefault();
// Refresh the SalesOrderHeader in the grid.
objCtx.Refresh(RefreshMode.StoreWins, header);
このトピックのコード シナリオは、Adventure Works データ バインド サンプル アプリケーションで使用されている Entity Framework データ バインドの主な機能です。完全なコードについては、「AdventureWorks データ バインド サンプル アプリケーション コード (EDM サンプル アプリケーション)」および「AdventureWorks データ バインド サンプルによる SalesOrderDetail フォームの追加 (EDM サンプル アプリケーション)」を参照してください。
参照
概念
AdventureWorks Sales Model (EDM)
AdventureWorks データ バインド サンプル アプリケーション コード (EDM サンプル アプリケーション)
AdventureWorks データ バインド サンプルによる SalesOrderDetail フォームの追加 (EDM サンプル アプリケーション)