19

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

1) Table "Order"

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

2) Table "Address"

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

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

  • 订单编号
  • 城市(属于该订单并由 AddressID-key 链接)

我怎样才能做到这一点?我的问题是:当我配置实体数据源时,我可以选择一个“EntitySetName”,它可以是“Order”或“Address”,但不能同时是两者,也不能选择任何类型的关系。如果我选择“订单”作为 EntitySetName,那么在 GridView 中我可以添加列

  • 订单编号
  • 地址
  • 地址.地址ID

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

提前感谢您的帮助!

编辑:澄清:

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

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

4

1 回答 1

43

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

选项1:

可以在 EntityDataSource 中使用select属性,该属性允许从多个相关实体/数据库表中创建任意数据投影(在我的情况下:Order 实体中的 OrderID 和 Address 实体中的 City)

缺点:在 EntityDataSource 中使用select使得在 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 的 columns 集合可以有一个这样的模板字段:

<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 中编辑 City(这是有道理的,因为它是属于另一个表的相关字段,可能属于许多其他订单)。但是可以编辑订单实体的平面字段以及订单的“AddressID”以分配另一个地址。

于 2010-02-18T14:45:44.377 回答