【问题标题】:Columns of two related database tables in one ASP.NET GridView with EntityDataSource一个带有 EntityDataSource 的 ASP.NET GridView 中两个相关数据库表的列
【发布时间】:2011-01-18 01:38:35
【问题描述】:

我有两个 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”,它可以是 “订单”或“地址”,但不能同时选择两者,我也不能选择任何一种关系。如果我选择“订单”作为 EntitySetName 然后在 GridView 我可以添加列

  • 订单号
  • 地址
  • 地址.AddressID

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

提前感谢您的帮助!

编辑:澄清:

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

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

【问题讨论】:

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


    【解决方案1】:

    好的,过了好几个小时我自己找到了解决方案:

    选项 1:

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

    缺点:在 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”以分配另一个地址。

    【讨论】:

    • 今晚正在做一个示例项目 - 这个答案在尝试设置类似结构时非常有用。谢谢。
    • 我希望每次我回到这个问题时都能再次 +1 这个答案 - 特别是对于“使用 BoundField 作为列......是不可能的。”。
    猜你喜欢
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 2013-02-07
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多