Adventure Works 数据绑定(EDM 示例应用程序)

AdventureWorks 数据绑定示例演示使用实体框架的数据绑定。主题 AdventureWorks 销售模型 (EDM) 中定义了该数据模型。此应用程序显示并修改与 SalesOrderHeader 实体关联的 SalesOrderDetail 实体。下图显示了用于将 SalesOrderDetail 实体添加到 SalesOrderHeader 的对话框以及在后台运行的主应用程序窗体。

AdventureWorks 销售模型数据绑定 EDM

实体框架中的数据绑定

ObjectQuery 数据绑定到 Windows 窗体上的 DataGridView 控件只需几行代码即可完成。首先,创建 ObjectQuery。然后,将 ObjectQuery 分配给 DataGridViewDataSource 属性。

下面的代码将 AdventureWorksSalesEntitiesObjectContext 提供的 ObjectQuery 中的单个 SalesOrderHeader 分配给 DataGridView 控件。查询参数通过分析文本框中的 SalesOrderHeaderID 号来创建。此参数在查询的 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 具有由 SalesOrderHeaderSalesOrderDetail 属性标识的关联 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。此操作是在单元格编辑处理程序中按照下面的代码顺序执行的。

首先,使用 ObjectContextSaveChanges 方法将单元格更改保存到存储。然后,ObjectQuery 检索 SalesOrderHeader 实体。最后,ObjectContextRefresh 方法更新绑定到 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 示例应用程序)