我为一个使用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>