Adventure Works 数据绑定(EDM 示例应用程序)
AdventureWorks 数据绑定示例演示使用实体框架的数据绑定。主题 AdventureWorks 销售模型 (EDM) 中定义了该数据模型。此应用程序显示并修改与 SalesOrderHeader 实体关联的 SalesOrderDetail 实体。下图显示了用于将 SalesOrderDetail 实体添加到 SalesOrderHeader 的对话框以及在后台运行的主应用程序窗体。
实体框架中的数据绑定
将 ObjectQuery 数据绑定到 Windows 窗体上的 DataGridView 控件只需几行代码即可完成。首先,创建 ObjectQuery。然后,将 ObjectQuery 分配给 DataGridView 的 DataSource 属性。
下面的代码将 AdventureWorksSalesEntitiesObjectContext 提供的 ObjectQuery 中的单个 SalesOrderHeader 分配给 DataGridView 控件。查询参数通过分析文本框中的 SalesOrderHeader 的 ID
号来创建。此参数在查询的 where
子句中使用,用于选择与 ID 号匹配的单个 SalesOrderHeader。查询分配给 DataGridView 控件的 DataSource 属性。上图中,Windows 窗体上具有**“销售订单标题”**标签的顶部 DataGridView 控件由下面的代码段使用数据进行填充。使用 Execute
方法可确保查询只执行一次。
ObjectParameter parameter =
new ObjectParameter("p", Int32.Parse(textBoxOrderId.Text));
dataGridViewSOHeader.DataSource =
objCtx.SalesOrderHeader.Where(
"it.SalesOrderID == @p",
parameter).Execute(MergeOption.OverwriteChanges);
上图中,具有**“销售订单详细信息”**标签的 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;
}
数据绑定方案中的修改
如果对**“销售订单详细信息”**数据网格中显示的一个 SalesOrderDetail 实体进行更改,则向存储中保存了新数据后,必须更新绑定了数据的 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);
本主题中的代码方案演示了 AdventureWorks 数据绑定示例应用程序中使用的实体框架数据绑定的主要功能。完整代码位于主题 AdventureWorks 数据绑定示例应用程序代码(EDM 示例应用程序)和 AdventureWorks 数据绑定示例添加 SalesOrderDetail 窗体(EDM 示例应用程序)中。
另请参见
概念
AdventureWorks 销售模型 (EDM)
AdventureWorks 数据绑定示例应用程序代码(EDM 示例应用程序)
AdventureWorks 数据绑定示例添加 SalesOrderDetail 窗体(EDM 示例应用程序)