在本演练中,您将创建一个 WCF RIA Services 应用程序,该应用程序从 AdventureWorksLT 数据库检索数据,然后将数据提供给呈现它们的 Silverlight 客户端。您要通过创建实体类(它们表示中间层的服务器上的各种数据库表)访问数据,然后通过创建域服务(它使 Silverlight 客户端能够访问这些中间层实体)来呈现这些数据。本演练可作为 RIA Services 文档中的许多其他演练的起点。
设置 RIA Services 解决方案
-
通过依次选择“文件”、“新建”和“项目”,在 Visual Studio 2010 中创建新的 RIA Services 项目。
此时将出现“新建项目”对话框。
-
从“已安装的模板”的“Silverlight”组中选择“Silverlight 应用程序”模板,然后将新项目命名为 RIAServicesExample。
-
单击“确定”。
此时将出现“新建 Silverlight 应用程序”对话框。
-
选中对话框底部附近的“启用 WCF RIA Services”复选框。选中此复选框可在客户端项目和服务器项目之间创建 RIA Services 链接。
-
单击“确定”创建解决方案。
该解决方案包含两个项目:一个客户端项目和一个服务器项目。客户端项目名为 RIAServicesExample,它包含用于创建表示层的 Silverlight 代码。服务器项目名为 RIAServicesExample.Web,它包含中间层代码。
在本节中,您将创建表示 AdventureWorksLT 数据库中的数据的 ADO.NET 实体类。RIA Services 适用于各种数据建模类和数据源。有关使用 RIA Services 访问数据的选项的更多信息,请参见数据主题。
警告: |
---|
在将实体数据模型 (EMD) 与 Visual Studio 2010
一起使用时,必须选择“在模型中加入外键列”选项。默认情况下,在使用“实体数据模型”向导时将选择此选项。您还必须使用在程序集中嵌入
EMD 映射信息的默认行为。
|
使数据在中间层上可用
-
在“解决方案资源管理器”中,右击服务器项目 (RIAServicesExample.Web),选择“添加”,然后选择“新建项”。
此时将出现“添加新项”对话框。
-
在类别列表中,选择“数据”,然后选择“ADO.NET 实体数据模型”模板。
-
将新文件命名为 AdventureWorksModel.edmx,并单击“添加”。
此时将出现“实体数据模型向导”。
-
在“选择模型内容”屏幕上,选择“从数据库生成”选项,然后单击“下一步”。
-
在“选择您的数据连接”屏幕上,创建与数据库的数据连接,然后单击“下一步”。
-
在“选择数据库对象”屏幕上,依次选择“Address”、“Customer”和“CustomerAddress”表。
-
确认“在模型中加入外键列”复选框已默认选中,然后单击“完成”。
这将为表创建实体模型。
-
生成(使用组合键 Ctrl+Shift+B)该解决方案。
在本节中,您将向中间层项目添加域服务。域服务将向客户端项目公开服务器项目中的数据实体和操作。可以将业务逻辑添加到域服务以管理客户端与数据交互的方式。
创建域服务
-
右击服务器项目,依次选择“添加”和“新建项”。
-
在类别列表中,选择“Web”,然后选择“域服务类”模板。
-
将类命名为 CustomerDomainService.cs(或 CustomerDomainService.vb)。
-
单击“添加”。
此时将出现“添加新的域服务类”对话框。
-
确保选中“启用客户端访问”框。
-
选择“Customer”实体,然后为它选中“启用编辑”框。
-
单击“确定”。
这将在新的 CustomerDomainService.cs(或 CustomerDomainService.vb)文件中生成
CustomerDomainService
类。 -
打开此文件。请注意,此文件具有以下特征:
-
CustomerDomainService
类派生自 LinqToEntitiesDomainService 类,后者是 RIA Services 框架中的抽象基类。此基类将自动使用,因为域服务会公开一个 ADO.NET 实体数据类。
- 泛型基类会绑定到在前面的步骤中由 ObjectContext 类型的
AdventureWorksLTEntities
在其泛型参数中创建的实体类。
-
CustomerDomainService
类是用 EnableClientAccessAttribute 特性标记的,以指示它对客户端层可见。
- 将生成名为
GetCustomers
的查询方法。此方法将在不进行任何筛选或排序的情况下返回每个项目。
- 已生成用于从记录插入、更新和删除客户的方法。
-
在其他演练中,将为您演示如何向域服务添加业务逻辑。在本演练中,您将只使用默认情况下生成的 GetCustomers
方法。
在生成解决方案时将生成客户端代理类。利用客户端项目和服务器项目之间建立的 RIA Services 链接,可以生成此代码。这些客户端代理类将提供对客户端中的数据的访问。
查看生成的客户端代理类
-
生成解决方案。
生成解决方案时,将在客户端项目中生成代码。
-
在“解决方案资源管理器”中,选择“RIAServicesExample”客户端项目,然后单击窗口顶部的“显示所有文件”图标。
请注意,Generated_Code 文件夹包含 RIAServicesExample.Web.g.cs(或 RIAServicesExample.Web.g.vb)文件。
-
在 Generated_Code 文件夹中打开代码文件。
请注意,此文件具有以下特征:
- 将生成派生自 WebContextBase 类的
WebContext
类。
- 将生成派生自 DomainContext 类的
CustomerDomainContext
类。此类具有一个名为GetCustomersQuery
的方法,该方法对应于域服务中创建的查询方法。
- 将为域服务所公开的实体生成派生自 Entity 类的
Customer
类。客户端项目中的Customer
实体类将匹配服务器上的Customer
实体。
- 将生成派生自 WebContextBase 类的
在 Silverlight 客户端中显示数据
-
打开 MainPage.xaml。
-
从左侧的“工具箱”中,将 DataGrid 控件拖动到 XAML 视图中的 Grid 元素内。
从“工具箱”拖动“DataGrid”控件将导致自动添加命名空间
using System.Windows.Controls
语句和对 System.Windows.Controls.Data 程序集的引用。警告: 如果添加 DataGrid 而不从“工具箱”拖动它,则必须将对 System.Windows.Controls.Data 程序集的引用添加到客户端项目,并手动将 using 语句添加到代码隐藏文件中。 -
将
AutoGeneratedColums
的值更改为 True,将DataGrid
元素命名为CustomerGrid
,并调整高度和宽度特性,如下面的 XAML 所示。<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="RIAServicesExample.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Grid x:Name="LayoutRoot" Background="White"> <data:DataGrid Name="CustomerGrid"></data:DataGrid> </Grid> </UserControl>
-
打开 MainPage.xaml 的代码隐藏文件。
-
向
using
(C#) 或Imports
(Visual Basic) 添加两个语句:using RIAServicesExample.Web;
和using System.ServiceModel.DomainServices.Client;
。RIAServicesExample.Web 命名空间是一个包含为 RIAServicesExample.Web.g.cs(或 RIAServicesExample.Web.g.vb)中的客户端项目生成的代码的命名空间。
-
若要实例化
CustomerDomainContext
,请在MainPage
类中添加代码行private CustomerDomainContext _customerContext = new CustomerDomainContext();
。Imports System.ServiceModel.DomainServices.Client Imports RIAServicesExample.Web Partial Public Class MainPage Inherits UserControl Private _customerContext As New CustomerDomainContext Public Sub New() InitializeComponent() Dim loadOp = Me._customerContext.Load(Me._customerContext.GetCustomersQuery()) CustomerGrid.ItemsSource = loadOp.Entities End Sub End Class
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using RIAServicesExample.Web; using System.ServiceModel.DomainServices.Client; namespace RIAServicesExample { public partial class MainPage : UserControl { private CustomerDomainContext _customerContext = new CustomerDomainContext(); public MainPage() { InitializeComponent(); LoadOperation<Customer> loadOp = this._customerContext.Load(this._customerContext.GetCustomersQuery()); CustomerGrid.ItemsSource = loadOp.Entities; } } }
-
通过使用 LoadOperation 调用
GetCustomersQuery
方法来检索客户实体:LoadOperation<Customer> loadOp = this._customerContext.Load(this._customerContext.GetCustomersQuery());
。 -
使用
CustomerGrid.ItemsSource = loadOp.Entities;
将加载的实体绑定到 DataGrid。总之,MainPage.xaml.cs 文件此时应包含以下代码:
//Namespaces added using RIAServicesExample.Web; using System.ServiceModel.DomainServices.Client; namespace RIAServicesExample { public partial class MainPage : UserControl { private CustomerDomainContext _customerContext = new CustomerDomainContext(); public MainPage() { InitializeComponent(); LoadOperation<Customer> loadOp = this._customerContext.Load(this._customerContext.GetCustomersQuery()); CustomerGrid.ItemsSource = loadOp.Entities; } } }
-
运行 (F5) 该应用程序。
您应看到与下面类似的数据网格。
本演练只演示从域服务创建项目和检索未筛选数据的基本步骤。以下是为便于您了解其他功能提出的一些建议:
- 创建自定义查询方法(例如,接受参数的查询),这些查询方法通常用于筛选数据。有关更多信息,请参见演练:添加查询方法。
- 向包含更新、插入和删除方法且管理数据修改过程的域服务添加业务逻辑。有关更多信息,请参见如何:向域服务添加业务逻辑。