EntityDataSource 快速入門範例
更新:2007 年 11 月
本主題中的範例將示範使用 ADO.NET EntityDataSource 控制項來實作資料繫結 (Data Binding) 案例。範例應用程式會顯示與 SalesOrderHeader (由 SalesOrderHeader 的識別索引鍵所識別) 關聯的 SalesOrderDetail 項目。應用程式中使用的資料模型是以隨附於 SQL Server 2005 的 AdventureWorks 範例資料庫為基礎。
下列畫面顯示使用中的工具。頁面左側的清單方塊包含 SalesOrderHeader 項目的識別索引鍵。在顯示的畫面中,按下了 SalesOrderHeader 編號 43666。關聯的 SalesOrderDetail 項目由右側的 Gridview 控制項顯示。
如何實作範例
範例的實作包含下列階段:
建立 ASP.NET Web 應用程式。
加入以 AdventureWorks 資料庫為基礎的 ADO.NET 實體資料模型。
加入清單方塊,顯示 SalesOrderHeader 索引鍵。
加入 GridView 控制項,顯示關聯的 SalesOrderDetail 項目。
加入並設定兩個 EntityDataSource 控制項,為清單方塊和 GridView 控制項提供資料。
為清單方塊已選取索引的變更事件,加入事件處理常式。
建立 ASP.NET Web 應用程式
在 Visual Studio 中,從 [檔案] 功能表建立 ASP.NET 應用程式。將專案命名為 GetOrders EDSC。Default.aspx 頁面標記隨即開啟,並顯示空白 HTML form 和 div 語法。
在標題標記 (Mark-up) 的標記 (Tag) 間提供頁面的標題。
加入 ADO.NET 實體資料模型
本應用程式將使用的資料是以 SQL Server 2005 隨附之 AdventureWorks 範例資料庫中的資料表為基礎,而建立的 Entity Data Model (EDM) 實作。
宣告五個實體:
Address
Contact
產品
SalesOrderDetail
SalesOrderHeader
在邏輯上,這些型別的執行個體是由概念結構描述建置之物件模型內的同名實體集所容納。
宣告三個關聯和關聯集。下列關聯的名稱全都是以 FK_ 開頭。這反映了 AdventureWorks 資料之資料表中的外部索引鍵關聯性。
FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID
FK_SalesOrderHeader_Address_ShipToAddressID
FK_SalesOrderHeader_Contact_ContactID
若要建立 AdventureWorks 銷售模型:
1.以滑鼠右鍵按一下 [方案總管] 中的 [GetOrders EDSC] 專案。
按一下 [加入/新項目]。
選取 [ADO.NET Entity Data Model] 並將新資料模型命名為 AdvWksSales.edmx。
出現 [實體資料模型精靈] 時,選取 [從資料庫產生] 並按 [下一步]。
建立 AdventureWorks 資料庫的連線,然後按 [下一步]。
出現 [選擇資料庫物件] 對話方塊時,選取 [Address]、[Contact]、[Product]、[SalesOrderDetail] 和 [SalesOrderHeading]。按一下 [完成]。
AdvWksSales.edmx 設計工具隨即開啟,並顯示資料模型的實體和關聯。請注意 SalesOrderHeader 實體和 SalesOrderDetail 實體之間的一對多關聯。在範例應用程式中,將會使用這兩種資料型別和兩者之間的關聯。建置專案以建立資料模型。
加入控制項以顯示資料
為了顯示 SalesOrderHeader 索引鍵和關聯的 SalesOrderDetail 項目,需要兩個資料控制項。
若要將顯示控制項加入頁面中:
在 Visual Studio 中開啟 Default.aspx 設計檢視,並將 div 邊框往下拖曳,以便有足夠空間可以將控制項加入頁面中。
加入具有下列文字的標籤:Select SalesOrderHeaderID。
在標籤下方加入清單方塊。您可以使用預設 ID ListBox1。根據本頁面底部的頁面標記,設定清單方塊的大小和位置。
將 GridView 控制項加入頁面,並根據本主題底部的頁面標記設定位置。您可以使用預設 ID GridView1。
在 GridView 控制項上方加入具有下列文字的標籤:SalesOrderHeader ID。
在 GridView 上方加入另一個標籤。這個標籤將在 CommandText 的參數中使用。提供可以反映其目的的 ID,例如:labelHeaderIDFromList。將此標籤的文字設定為空字串。
加入並設定 EntityDataSource 控制項
若要加入 EntityDataSource 控制項:
將 EntityDataSource 控制項加入頁面中。將這個 EntityDataSource 控制項命名為 EntDataSrc_OrderID。這個控制項將繫結至 ListBox1 以顯示 SalesOrderHeader 索引鍵。
將另一個 EntityDataSource 控制項加入頁面中。將這個 EntityDataSource 控制項命名為 EntDataSrc_OrderDetails。這個控制項將繫結至 Gridview1,以根據使用者在 ListBox1 中選取的 SalesOrderHeader 識別索引鍵,顯示與其關聯的 SalesOrderDetail 實體。
![]() |
---|
如果自從加入 AdvWksSalesModel 的 Entity Data Model (EDM) 後尚未建置專案,請立即建置專案,否則下列步驟不會如所述般運作。建置 EDM 專案時,會將 EDM 中繼資料 (Metadata) 成品置入 WebConfig 檔中連接字串 (Connection String) 所指定的位置。 |
若要將 ListBox1 的資料繫結設定為 EntDataSrc_OrderID:
按一下 [EntityDataSource] 控制項上的 [>] 符號。
按一下 [設定資料來源]。
出現 [設定物件內容] 對話方塊時,從下拉式清單中選取 [命名連線AdventureWorksEntities]。這樣即可識別 Web.config 檔中的連接字串。
從 [DefaultContainerName] 下拉式清單中,選取 [AdventureWorksEntities]。這是資料模型在其設計結構描述中所使用之 EntityContainer 的名稱。按 [下一步]。
出現 [設定資料選取範圍] 對話方塊時,從 [EntitySetName] 下拉式清單中選取 [SalesOrderHeader]。此型別不是繼承階層架構 (Inheritance Hierarchy) 的一部分,所以 [EntityTypeFilter] 可以保持空白。
在 [Select 陳述式] 核取方塊中勾選 [SalesOrderID]。按一下 [完成]。
按一下 [ListBox1] 上的 [>] 符號,並選取 [選擇資料來源]。
出現 [選擇資料來源] 對話方塊時,從 [選取資料來源] 下拉式清單中選擇 [EntDataSrc_OrderID]。然後,在接下來的兩個下拉式清單中選取 [SalesOrderID]。
按一下 [確定]。
在這個階段執行應用程式很有益處。清單方塊會顯示資料來源中所有 SalesOrderHeader 實體的識別索引鍵。實作應用程式的其他部分時,這項資訊會很有用,使用者可以選取一個索引鍵,並在頁面右側的 Gridview1 中顯示與 SalesOrderHeader 關聯的所有 SalesOrderDetail 實體。
使用 GridView 控制項設定 EntityDataSource
若要將關聯的訂單繫結至 Gridview1:
在 Default.aspx 頁面的設計介面中,選取名為 EntDataSrc_OrderDetails 的 [EntityDataSource] 控制項。
按一下 [EntityDataSource] 控制項上的 [>] 符號。
按一下 [設定資料來源]。
出現 [設定物件內容] 對話方塊時,從下拉式清單中選取 [命名連線AdventureWorksEntities]。
從 [DefaultContainerName] 下拉式清單中,選取 [AdventureWorksEntities]。
按 [下一步]。
出現 [設定資料選取範圍] 對話方塊時,從 [EntitySetName] 下拉式清單中選取 [SalesOrderDetail]。此型別不是繼承階層架構的一部分,所以 EntityTypeFilter 可以保持空白。
在 [Select 陳述式] 核取方塊中勾選 [SalesOrderDetailID]、[OrderQty]、[ProductID]、[UnitPrice] 和 [ModifiedDate]。
按一下 [完成]。
以滑鼠右鍵按一下 [EntityDataSource] 控制項,然後選取 [屬性]。
在 [屬性] 清單中選取 [Where],然後按一下文字方塊右側的省略符號。
出現 [運算式編輯器] 對話方塊時,在 [Where 運算式] 文字區域輸入下列文字:it.[SalesOrderID] = @parSalesOrderID。
按一下 [參數] 清單方塊下方的 [加入參數] 按鈕。將新參數命名為 parSalesOrderID。當使用者選取 SalesOrderHeader 清單方塊中的識別索引鍵時,會從所設定的標籤文字取得這個參數。這在 [參數來源] 下拉式清單中指定。
選取 [控制項]。
在 [ControlID] 下拉式清單中選取 [labelHeaderIDFromList]。
按一下 [確定]。
清單方塊已選取索引之變更的事件處理常式
這個實作的最後一個階段,是要將使用者選取的 SalesOrderHeader 識別索引鍵連接至查詢,此查詢會傳回與所選取 SalesOrderHeader 關聯的所有 SalesOrderDetail 實體之屬性。
將查詢設定為傳回下列屬性:SalesOrderDetailID、OrderQty、ProductID、UnitPrice 和 ModifiedDate。EntityDataSource 控制項設定為從網頁上的 labelHeaderIDFromList 控制項取得參數,並將其提供給查詢的 Where 子句,以識別要顯示其屬性之 SalesOrderDetail 實體的關聯 SalesOrderHeader。現在,您必須將用於設定 labelHeaderIDFromList 控制項之文字屬性的程式碼加入至使用者選取之 SalesOrderHeader 的識別索引鍵。
若要為 ListBox1 的 SelectedIndexChanged 事件建立事件處理常式:
在 Web 網頁設計介面中,選取 [ListBox1]。
以滑鼠右鍵按一下 [ListBox1],然後選取 [屬性]。
在 [屬性] 清單中,按一下事件選項。
按兩下 [SelectedIndexChanged] 事件。如此隨即開啟 ASP.NET 程式碼後置 (Code-Behind) 頁面 Default.aspx.cs 或 Default.aspx.vb,並顯示事件處理常式的程式碼區塊。
建立步驟 6 下方程式碼區塊中顯示的事件處理常式。處理常式中的程式碼會將 labelHeaderIDFromList 的值設定為使用者在 ListBox1 中選取的值,並將 GridView1 的 DataSource 屬性指派給 EntDataSrcOrder。最後,它會在 EntDataSrc_OrderDetails 上呼叫 DataBind 方法。該控制項已設定為根據 labelHeaderIDFromList 的識別索引鍵來查詢資料。
將 ListBox1 的 AutoPostBack 屬性設定為 true,如此伺服器就能在選取項目產生時立即加以讀取。
protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
labelHeaderIDFromList.Text = ListBox1.SelectedValue;
GridView1.DataSource = EntDataSrc_OrderDetails;
GridView1.DataBind();
}
引發 SelectedIndexChanged 事件時,具有參數化之 Where 子句的預先定義查詢就會執行。GridView1 中顯示的屬性,是與 ListBox1 中所選取 SalesOrderHeader 關聯之SalesOrderDetail 實體的屬性。
所有控制項的頁面標記
下列頁面標記包含已在應用程式中初始化的所有控制項和屬性,這個應用程式會顯示與您建置之 SalesOrderHeader 關聯的 SalesOrderDetail 實體。Where 子句包含一個參數,其中包含與 SalesOrderDetail 實體關聯之 SalesOrderHeader 的外部索引鍵。
<body>
<form id="form1" >
<div style="height: 450px">
<br />
<asp:ListBox ID="ListBox1"
Height="275px"
Width="100px"
style="position:absolute; left:50px; top:80px"
DataSourceID="EntDataSrc_OrderID" DataTextField="SalesOrderID"
DataValueField="SalesOrderID" AutoPostBack="True"
onselectedindexchanged="ListBox1_SelectedIndexChanged" >
</asp:ListBox>
<asp:GridView ID="GridView1"
style="position:absolute; left:200px; top:75px">
</asp:GridView>
<asp:Label ID="Label1"
Text="Select SalesOrderHeaderID"></asp:Label>
<asp:Label ID="Label2" Text="SalesOrderHeaderID:"></asp:Label>
<asp:Label ID="labelHeaderIDFromList" ></asp:Label>
</div>
<asp:EntityDataSource ID="EntDataSrc_OrderID"
ConnectionString="name=AdventureWorksEntities"
DefaultContainerName="AdventureWorksEntities"
EntitySetName="SalesOrderHeader">
</asp:EntityDataSource>
<asp:EntityDataSource ID="EntDataSrc_OrderDetails"
ConnectionString="name=AdventureWorksEntities"
DefaultContainerName="AdventureWorksEntities"
EntitySetName="SalesOrderDetail"
Select="it.[SalesOrderDetailID], it.[OrderQty],
it.[ProductID], it.[UnitPrice], it.[ModifiedDate]"
Where="it.[SalesOrderID] = @parSalesOrderID">
<WhereParameters>
<asp:ControlParameter Name="parSalesOrderID" ControlID="labelHeaderIDFromList" Type="Int32"/>
</WhereParameters>
</asp:EntityDataSource>
</form>
</body>
使用命令文字進行實作
先前章節中的標記所顯示的實作,是使用 Where 子句來顯示與 SalesOrderHeader 關聯的 SalesOrderDetail 實體。使用 Entity SQL 查詢並搭配 CommandText,也可以獲得相同的結果。在這個情況下,該參數是搭配包含左方相互關聯的查詢來使用。左方相互關聯會同時尋找 SalesOrderHeader 和 SalesOrderDetail 實體的屬性。
<body>
<form id="form1" >
<div style="height: 430px; width: 805px">
Search Sales Orders <br />
Select Order ID:
<br />
<asp:Label ID="LabelHeaderID"
Text="SalesOrderHeaderID:"
style="position:absolute; left:200px; top:40px"></asp:Label>
<asp:Label ID="LabelHeaderIDFromList" Text=""
style="position:absolute; left:375px; top:40px"></asp:Label>
<br />
<asp:ListBox ID="ListBox1"
DataSourceID="EntDatSrc_OrderID"
DataTextField="SalesOrderID"
DataValueField="SalesOrderID" Height="285px"
Width="100px" style="position:absolute;
left:50px; top:80px"
AutoPostBack="True"
onselectedindexchanged="ListBox1_SelectedIndexChanged">
</asp:ListBox>
<asp:GridView ID="GridView1"
style="position:absolute; left:200px; top:80px"
AllowPaging="false">
</asp:GridView>
<br />
</div>
<asp:EntityDataSource ID="EntDatSrc_OrderID"
DefaultContainerName="AdventureWorksEntities"
EntitySetName="SalesOrderHeader"
Select="it.[SalesOrderID]"
ConnectionString="name=AdventureWorksEntities">
</asp:EntityDataSource>
<asp:EntityDataSource ID="EntDatSrcOrderDetails"
DefaultContainerName="AdventureWorksEntities"
CommandText="SELECT soh.SalesOrderID, sod.SalesOrderDetailID,
sod.OrderQty, sod.ProductID, sod.UnitPrice, sod.ModifiedDate
FROM AdventureWorksEntities.SalesOrderHeader
AS soh, soh.SalesOrderDetail AS sod
WHERE soh.SalesOrderID = @parSalesOrderID"
ConnectionString="name=AdventureWorksEntities" >
<CommandParameters>
<asp:ControlParameter Name="parSalesOrderID"
ControlID="LabelHeaderIDFromList" Type="Int32"/>
</CommandParameters>
</asp:EntityDataSource>
</form>
</body>