EntityDataSource 快速入门示例
更新:2007 年 11 月
本主题中的示例演示如何使用 ADO.NET EntityDataSource 控件来实现数据绑定方案。示例应用程序显示与由 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 语法。
在标题标记之间为页指定标题。
添加 ADO.NET 实体数据模型
此应用程序将要使用的数据,是基于随 SQL Server 2005 一起提供的 AdventureWorks 示例中的表的实体数据模型 (EDM) 实现。
声明了以下五个实体:
Address
Contact
Product
SalesOrderDetail
SalesOrderHeader
这些类型的实例逻辑上包含在对象模型中从概念性架构生成的同名实体集中。
声明了三个关联和关联集。以下关联的名称全部以 FK_ 开头。这反映了 AdventureWorks 数据表中的外键关系。
FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID
FK_SalesOrderHeader_Address_ShipToAddressID
FK_SalesOrderHeader_Contact_ContactID
创建 AdventureWorks 销售额模型:
右击**“解决方案资源管理器”**中的 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 实体数据模型 (EDM) 后没有生成过项目,请立即生成项目,否则将不能按照描述的那样完成以下步骤。生成 EDM 项目会将 EDM 元数据项目放在由 WebConfig 文件中的连接字符串指定的位置。 |
将 ListBox1 的数据绑定配置为 EntDataSrc_OrderID:
在 EntityDataSource 控件上单击**“>”**符号。
单击**“配置数据源”**。
出现**“配置对象上下文”对话框后,从下拉列表中选择“命名连接”**AdventureWorksEntities。这将标识 WebConfig 文件中的连接字符串。
从**“DefaultContainerName”下拉列表中选择 AdventureWorksEntities。这是其设计架构中数据模型所使用的 EntityContainer 的名称。单击“下一步”**。
出现**“配置数据选择”对话框后,从“EntitySetName”下拉列表中选择 SalesOrderHeader。此类型不是继承层次结构的一部分,因此“EntityTypeFilter”**可以保留为空白。
从**“选择语句”复选框中选中“SalesOrderID”。单击“完成”**。
单击 ListBox1 控件上的**“>”符号,然后选择“选择数据源”**。
出现**“选择数据源”对话框后,从“选择数据源”**下拉列表中选择 EntDataSrc_OrderID。在下两个下拉列表中选择 SalesOrderID。
单击**“确定”**。
在此阶段,将指导您运行应用程序。列表框将显示数据源中 SalesOrderHeader 实体的所有标识键。实现应用程序的其余部分后,此信息会很有用,用户可以选择一个键,也可以在页右侧的 Gridview1 中显示所有与 SalesOrderHeader 相关联的 SalesOrderDetail 项。
使用 GridView 控件配置 EntityDataSource
将关联的订单绑定到 Gridview1:
在 Default.aspx 页的设计图面上选择名为 EntDataSrc_OrderDetails 的 EntityDataSource 控件。
在 EntityDataSource 控件上单击**“>”**符号。
单击**“配置数据源”**。
出现**“配置对象上下文”对话框后,从下拉列表中选择“命名连接”**AdventureWorksEntities。
从**“DefaultContainerName”**下拉列表中选择 AdventureWorksEntities。
单击**“下一步”**。
出现**“配置数据选择”对话框后,从“EntitySetName”下拉列表中选择“SalesOrderDetail”。此类型不是继承层次结构的一部分,因此“EntityTypeFilter”**可以保留为空白。
从**“选择语句”**复选框中选中 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 事件创建事件处理程序:
在页设计图面上选择 ListBox1。
右击 ListBox1 并选择**“属性”**。
在**“属性”**列表中单击事件选项。
双击**“SelectedIndexChanged”**事件。将打开 ASP.NET 代码隐藏页 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" runat="server">
<div style="height: 450px">
<br />
<asp:ListBox ID="ListBox1" runat="server"
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" runat="server"
style="position:absolute; left:200px; top:75px">
</asp:GridView>
<asp:Label ID="Label1" runat="server"
Text="Select SalesOrderHeaderID"></asp:Label>
<asp:Label ID="Label2" runat="server" Text="SalesOrderHeaderID:"></asp:Label>
<asp:Label ID="labelHeaderIDFromList" runat="server"></asp:Label>
</div>
<asp:EntityDataSource ID="EntDataSrc_OrderID" runat="server"
ConnectionString="name=AdventureWorksEntities"
DefaultContainerName="AdventureWorksEntities"
EntitySetName="SalesOrderHeader">
</asp:EntityDataSource>
<asp:EntityDataSource ID="EntDataSrc_OrderDetails" runat="server"
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 实体。通过包含实体 SQL 查询的 CommandText 可以得到相同的结果。在这种情况下,参数用于包含左相关的查询。左相关可以查找 SalesOrderHeader 和 SalesOrderDetail 实体的属性。
<body>
<form id="form1" runat="server">
<div style="height: 430px; width: 805px">
Search Sales Orders <br />
Select Order ID:
<br />
<asp:Label ID="LabelHeaderID"
runat="server" Text="SalesOrderHeaderID:"
style="position:absolute; left:200px; top:40px"></asp:Label>
<asp:Label ID="LabelHeaderIDFromList" runat="server" Text=""
style="position:absolute; left:375px; top:40px"></asp:Label>
<br />
<asp:ListBox ID="ListBox1" runat="server"
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" runat="server"
style="position:absolute; left:200px; top:80px"
AllowPaging="false">
</asp:GridView>
<br />
</div>
<asp:EntityDataSource ID="EntDatSrc_OrderID" runat="server"
DefaultContainerName="AdventureWorksEntities"
EntitySetName="SalesOrderHeader"
Select="it.[SalesOrderID]"
ConnectionString="name=AdventureWorksEntities">
</asp:EntityDataSource>
<asp:EntityDataSource ID="EntDatSrcOrderDetails" runat="server"
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>