Sla*_*uma 19 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)
...
Run Code Online (Sandbox Code Playgroud)
然后我从这两个表中创建了一个(ADO.NET)实体数据模型.现在,在我的(ASP.NET)网页上,我将GridView与EntityDataSource放在一起.在我的GridView中,我想显示两列:
我怎样才能做到这一点?我的问题是:当我配置实体数据源时,我可以选择"EntitySetName",它可以是"Order"或"Address",但不能同时选择,也不能选择任何类型的关系.如果我选择"Order"作为EntitySetName,那么在GridView中我可以添加列
添加"地址"列会显示空单元格.添加"OrderID"和"Address.AddressID"会显示预期的ID.但是如何将相关地址的"城市"添加到我的GridView?
提前感谢您的帮助!
编辑:澄清:
实体框架创建了一个类"Order"和一个与数据库表对应的类"Address"."Order"类引用"Address"对象作为导航属性,对应于Address和Order表之间的1-n关系.
基本上我想在我的GridView中有一个显示Order.Address.City的列.我试图将带有"Address.City"的绑定字段作为数据字段添加到GridView,但它会导致运行时错误("没有这样的属性......").
Sla*_*uma 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>
Run Code Online (Sandbox Code Playgroud)
然后GridView的列集合可以有一个模板字段,如下所示:
<asp:TemplateField HeaderText="City" >
<ItemTemplate>
<asp:Label ID="LabelCity" runat="server" Text='<%# Eval("Address.City") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
Run Code Online (Sandbox Code Playgroud)
这里Eval非常重要.绑定不起作用.还使用BoundField作为列...
<asp:BoundField DataField="Address.City" HeaderText="City" />
Run Code Online (Sandbox Code Playgroud)
......是不是可能.因此,在GridView中无法编辑城市(这是有道理的,因为它的相关字段属于另一个表,也许还有许多其他订单).但是可以编辑订单实体的平面字段以及订单的"AddressID"以分配另一个地址.
| 归档时间: |
|
| 查看次数: |
23545 次 |
| 最近记录: |