3

我正在为使用 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>
4

1 回答 1

5

您需要使用实体数据源的 Include 属性来获取相关实体。然后,更改标记以查询这些实体。

看看“编程实体框架”一书中的几页:http: //books.google.com/books ?id=wp8V0vBebnoC&pg=PA284&lpg=PA284&dq=entitydatasource+include&source=bl&ots=cKtfB1J8vC&sig=C--WGKuU-9CNOQgDxdN0MpSMLt4&hl =en&ei=OidPTMnKB5P-ngeM1rinBw&sa=X&oi=book_result&ct=result&resnum=7&ved=0CDAQ6AEwBg#v=onepage&q=entitydatasource%20include&f=false

于 2010-07-27T18:40:39.143 回答