如何让EntityDataSource允许我访问子实体?

时间:2010-07-27 18:24:19

标签: asp.net entity-framework entitydatasource

我有一个非常简单的模型,我正在为使用Northwind数据库的客户端做。我有一个包含三个实体的EDMX文件:产品,类别和供应商。

我正在尝试创建一个包含显示产品的GridView的页面,包括类别名称和供应商名称。使用LINQ to SQL,我可以让LinqDataSource控件返回Products实体,然后可以在GridView中拥有一个TemplateField,如下所示:

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

然而,似乎EntityDataSource并没有那么好玩。就好像它不会延迟加载类别数据一样。我有一个非常简单的EDS:

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

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

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_Load事件处理程序中编写代码,我知道延迟加载适用于EDMX b / c:

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

我可以通过p.Category.CategoryName获取类别名称而不会出错。

我是否需要做一些巫术,以使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 个答案:

答案 0 :(得分:5)