代码之家  ›  专栏  ›  技术社区  ›  Scott Mitchell

如何获取EntityDataSource以允许我访问子实体?

  •  3
  • Scott Mitchell  · 技术社区  · 15 年前

    我为一个使用Northwind数据库的客户机制作了一个非常简单的模型。我有一个包含三个实体的EDMX文件:产品、类别和供应商。

    <ItemTemplate>
        <%# Eval("Category.CategoryName") %>
    </ItemTemplate>
    

    <asp:EntityDataSource ID="dsProducts" runat="server" 
        ConnectionString="name=NorthwindEntities" 
        DefaultContainerName="NorthwindEntities" EnableFlattening="False" 
        EntitySetName="Products">
    </asp:EntityDataSource>
    

    但是GridView不显示类别名称。如果我为GridView创建一个RowDataBound事件处理程序并获取绑定到该行的产品实体,我会看到产品的Category属性不返回任何内容。例如,如果我这样做:

    Protected Sub gvProducts_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvProducts.RowDataBound
        If e.Row.RowType = DataControlRowType.DataRow Then
            Dim p As NorthwindModel.Product = e.Row.DataItem
            Dim catName = p.Category.CategoryName
        End If
    End Sub
    

    我在尝试执行p.Category.CategoryName时遇到NullReferenceException。

    但是,如果我在Page\u Load事件处理程序中编写如下代码,我知道延迟加载适用于EDMX b/c:

        Dim context As New NorthwindModel.NorthwindEntities
        Dim p = context.Products.Take(1).Single()
    

    为了让EntityDataSource包含对检索相关实体的支持,我需要做一些巫术吗?

    谢谢

    解决方案: 我指定了EntityDataSource的Include属性,并指出了要包括的实体对象。具体来说,我将EntityDataSource控件的声明性标记更新为:

    <asp:EntityDataSource ID="dsProducts" runat="server" 
        ConnectionString="name=NorthwindEntities" 
        DefaultContainerName="NorthwindEntities" EnableFlattening="False" 
        EntitySetName="Products" Include="Category,Supplier">
    </asp:EntityDataSource>
    
    1 回复  |  直到 15 年前
        1
  •  5
  •   DCNYAM    15 年前