我有一个非常简单的模型,我正在为使用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>
答案 0 :(得分:5)
您需要使用实体数据源的Include属性来获取相关实体。然后,更改标记以查询这些实体。