1) Table "Order" OrderID,int,PK AddressID,FK ... 2) Table "Address" AddressID,PK City,nvarchar(50) ...
然后我从这两个表中创建了一个(ADO.NET)实体数据模型。
现在在我的(ASP.NET)网页上,我把一个GridView与EntityDataSource。在我的GridView中,我想显示两列:
> OrderID
>城市(属于该订单并通过AddressID-key链接)
我怎样才能做到这一点?我的问题是:当我配置实体数据源时,我可以选择一个“EntitySetName”即可
“订单”或“地址”,但不是两者,也不能选择任何种类的关系。如果我选择“Order”作为EntitySetName
那么在GridView中我可以添加列
> OrderID
>地址
> Address.AddressID
添加列“地址”将显示空单元格。添加“OrderID”和“Address.AddressID”显示预期的ID。但是我怎么能
将相关地址的“City”添加到我的GridView?
谢谢你提前帮忙!
编辑:澄清:
实体框架已经创建了一个类“Order”和一个对应于数据库表的“Address”类。 “订单”类引用“地址”对象作为导航属性,对应于地址和订单表之间的1-n关系。
基本上我想在我的GridView中显示一个列,显示Order.Address.City。我已经尝试添加一个绑定字段“Address.City”作为数据字段到GridView,但它会导致运行时错误(“没有这样的属性…”)。
解决方法
选项1:
可以使用EntityDataSource中的select属性,允许从几个相关实体/数据库表创建任意数据的投影(在我的情况下:OrderID从Order实体和City从
地址实体)
缺点:使用EntityDataSource中的select使GridView中的Insert,Update和Delete不可能!
选项二:
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”来分配另一个地址。