Adventure Works 資料繫結 (EDM 範例應用程式)

AdventureWorks 資料繫結範例會示範使用 Entity Framework 的資料繫結。其資料模型定義於主題 AdventureWorks Sales Model (EDM) 中。這個應用程式會顯示並修改與 SalesOrderHeader 實體關聯的 SalesOrderDetail 實體。下圖顯示用來將 SalesOrderDetail 實體加入 SalesOrderHeader 的對話方塊及主要應用程式表單 (在背景)。

Adventureworks SalesModel DataBinding EDM

Entity Framework 中的資料繫結

可以使用幾行程式碼來完成 ObjectQueryDataGridView 控制項的資料繫結。首先,請建立 ObjectQuery。然後,將 ObjectQuery 指派給 DataGridViewDataSource 屬性。

下列程式碼會將 AdventureWorksSalesEntitiesObjectContext 所提供之 ObjectQuery 中的單一 SalesOrderHeader 指派給 DataGridView 控制項。會從文字方塊剖析 SalesOrderHeader 中的 ID 編號來建立此查詢的參數。這個參數會用於此查詢的 where 子句中,以選取符合 ID 編號的單一 SalesOrderHeader。而查詢會指派給 DataGridView 控制項的 DataSource 屬性。在上圖中,Windows Form 上的頂層 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 具有關聯之 SalesOrderDetail 實體的集合 (這些實體是由 SalesOrderHeaderSalesOrderDetail 屬性所識別)。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 資料繫結範例應用程式中所使用之 Entity Framework 資料繫結的主要功能。完整的程式碼包含在以下的主題中:AdventureWorks 資料繫結範例應用程式程式碼 (EDM 範例應用程式)AdventureWorks 資料繫結範例加入 SalesOrderDetail 表單 (EDM 範例應用程式)

另請參閱

概念

AdventureWorks Sales Model (EDM)
AdventureWorks 資料繫結範例應用程式程式碼 (EDM 範例應用程式)
AdventureWorks 資料繫結範例加入 SalesOrderDetail 表單 (EDM 範例應用程式)