一个带有EntityDataSource的ASP.NET GridView中的两个相关数据库表的列

时间:2010-02-17 21:01:55

标签: asp.net gridview ado.net-entity-data-model

我有两个带有主键(PK)的SQL Server表和一个链接这两个表的外键(FK):

1) Table "Order"

OrderID, int, PK  
AddressID, int, FK
...

2) Table "Address"

AddressID, int, PK
City, nvarchar(50)
...

然后我从这两个表中创建了一个(ADO.NET)实体数据模型。 现在,在我的(ASP.NET)网页上,我将GridView与EntityDataSource放在一起。在我的GridView中,我想显示两列:

  • 订单ID
  • 城市(属于该订单并通过AddressID密钥链接)

我该怎么做?我的问题是:当我配置实体数据源时,我可以选择一个“EntitySetName” “订单”或“地址”但不是两者,也不能选择任何一种关系。如果我选择“Order”作为EntitySetName 然后在GridView中我可以添加列

  • OrderID
  • 地址
  • Address.AddressID

添加“地址”列会显示空单元格。添加“OrderID”和“Address.AddressID”会显示预期的ID。但我怎么能 将相关地址的“城市”添加到我的GridView?

提前感谢您的帮助!

编辑:澄清:

实体框架创建了一个“Order”类和一个与数据库表对应的类“Address”。 “Order”类引用“Address”对象作为导航属性,对应于Address和Order表之间的1-n关系。

基本上我想在GridView中有一个显示Order.Address.City的列。我试图将带有“Address.City”的绑定字段作为数据字段添加到GridView,但它会导致运行时错误(“没有这样的属性......”)。

1 个答案:

答案 0 :(得分:43)

好的,太多小时后我自己找到了解决方案:

选项1:

可以在EntityDataSource中使用 select 属性,该属性允许从几个相关实体/数据库表创建数据的任意投影(在我的例子中:来自Order实体的OrderID和来自 地址实体)

缺点:在EntityDataSource中使用选择,无法在GridView中使用Insert,Update和Delete!

选项2:

EntityDataSource必须具有 include 属性才能包含相关的地址属性以及查询的订单。标记看起来像这样:

<asp:EntityDataSource ID="EntityDataSourceOrders" runat="server" 
    ConnectionString="name=MyEntitiesContext" 
    DefaultContainerName="MyEntitiesContext" 
    EntitySetName="Order" Include="Address"
    EnableDelete="True" EnableInsert="True" 
    EnableUpdate="True">
</asp:EntityDataSource>

然后GridView的列集合可以有一个模板字段,如下所示:

<asp:TemplateField HeaderText="City" >
  <ItemTemplate>
    <asp:Label ID="LabelCity" runat="server" Text='<%# Eval("Address.City") %>'>
    </asp:Label>
  </ItemTemplate>
</asp:TemplateField>

这里 Eval 很重要。 绑定不起作用。同时使用 BoundField 作为列...

<asp:BoundField DataField="Address.City" HeaderText="City" />

... 可能。因此,在GridView中无法编辑城市(这是有道理的,因为它的相关字段属于另一个表,也许还有许多其他订单)。但是可以编辑订单实体的平面字段以及订单的“AddressID”以分配另一个地址。