在上一篇(Silverlight学习点滴之三——DataGrid的基本使用)的第一个运行截图中,我们看到第一列是Category,并且全部都是空白。

转到数据库的表中查看,发现Products表只有CategoryID,而没有Category这个属性!那么,这个Category是···?答案在Model.edmx里:

可以看到,Category和Product两张表之间有个外键,这个外键在EF中表现为一对导航属性。在缺省状态下,导航属性的值为null,必须做一些设置才能得到相应的值:

修改ProductMetadata

在NorthwindService.metadata.cs中,找到修改ProductMetadata中需要显示的导航属性,为其添加Include特性

internal sealed class ProductMetadata
{
......

[Include]
public Category Category { get; set; }

[Include]
public Supplier Supplier { get; set; }

......
}

为域服务添加新的查询方法

新的查询方法只在原有的GetGetProducts后加一个Include方法,参数是需要包含的导航属性名字,在这里,可以包含多个Include。

public partial class NorthwindService
{
public IQueryable<Product> GetGetProductsDetail()
{
return this.ObjectContext.Products.Include("Category");
}
}

修改DataGrid的绑定代码

修改分类这一列的绑定代码

<sdk:DataGrid Name="dataGrid" AutoGenerateColumns="False" Margin="12" IsReadOnly="True" Loaded="DataGridLoaded">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="产品名称" Binding="{Binding ProductName}" />
<!-- 注意‘分类’,绑定的Category的Name -->
<sdk:DataGridTextColumn Header="分类" Binding="{Binding Category.CategoryName}" />
<sdk:DataGridTextColumn Header="规格" Binding="{Binding QuantityPerUnit}" />
<sdk:DataGridTextColumn Header="单价" Binding="{Binding UnitPrice}" />
<sdk:DataGridTextColumn Header="存货数量" Binding="{Binding UnitsInStock}" />
<sdk:DataGridTextColumn Header="预订数量" Binding="{Binding UnitsOnOrder}" />
<sdk:DataGridTextColumn Header="再订购标准" Binding="{Binding ReorderLevel}" />
<sdk:DataGridCheckBoxColumn Header="是否停产" Binding="{Binding Discontinued}" />
</sdk:DataGrid.Columns>
</sdk:DataGrid>

把查询的方法换掉

private void DataGridLoaded(object sender, RoutedEventArgs e)
{
var context
= new NorthwindContext();
context.Load(context.GetGetProductsDetailQuery(),
true);
dataGrid.ItemsSource
= context.Products;
}

调试一下,分类名终于显示出来了:

附上源码:SilverlightDataGridTest_2011.08.17.rar

参考链接:
WCF RIA Services & EF - Tip: Silverlight端访问外键关联实体

作者: 贼寇在何方 发表于 2011-08-17 20:47 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"