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