演练:创建 RIA Services 解决方案

在本演练中,您将创建一个 WCF RIA Services 应用程序,该应用程序从 AdventureWorksLT 数据库检索数据,然后将数据提供给呈现它们的 Silverlight 客户端。您要通过创建实体类(它们表示中间层的服务器上的各种数据库表)访问数据,然后通过创建域服务(它使 Silverlight 客户端能够访问这些中间层实体)来呈现这些数据。本演练可作为 RIA Services 文档中的许多其他演练的起点。

必备条件

除 WCF RIA Services 和 WCF RIA Services 工具包之外,本演练和 RIA Services 文档中提供的其他演练还要求正确安装和配置 Visual Studio 2010 和 Silverlight Developer 运行时及 SDK 等必备程序。它们还要求安装和配置具有高级服务的 SQL Server 2008 R2 Express,并安装 AdventureWorks OLTP 和 LT 数据库。

WCF RIA Services 的必备条件节点中的主题提供有关如何满足这些前提条件的详细说明。在继续本演练之前,请按照此处提供的说明执行操作,以确保您在执行本 RIA Services 演练时尽可能少地遇到问题。

创建包含项目间 RIA Services 链接的解决方案

设置 RIA Services 解决方案

  1. 通过依次选择**“文件”“新建”“项目”**,在 Visual Studio 2010 中创建新的 RIA Services 项目。

    此时将出现**“新建项目”**对话框。

  2. 从**“已安装的模板”“Silverlight”组中选择“Silverlight 应用程序”**模板,然后将新项目命名为 RIAServicesExample

    RIA_StartProject

  3. 单击**“确定”**。

    此时将出现**“新建 Silverlight 应用程序”**对话框。

  4. 选中对话框底部附近的**“启用 WCF RIA Services”**复选框。选中此复选框可在客户端项目和服务器项目之间创建 RIA Services 链接。

    RIA_CreateProjectwithLink

  5. 单击**“确定”**创建解决方案。

    该解决方案包含两个项目:一个客户端项目和一个服务器项目。客户端项目名为 RIAServicesExample,它包含用于创建表示层的 Silverlight 代码。服务器项目名为 RIAServicesExample.Web,它包含中间层代码。

    RIA_ProjectsCreated

创建数据模型

在本节中,您将创建表示 AdventureWorksLT 数据库中的数据的 ADO.NET 实体类。RIA Services 适用于各种数据建模类和数据源。有关使用 RIA Services 访问数据的选项的更多信息,请参见数据主题。

Caution警告:
在将实体数据模型 (EMD) 与 Visual Studio 2010 一起使用时,必须选择“在模型中加入外键列”选项。默认情况下,在使用“实体数据模型”向导时将选择此选项。您还必须使用在程序集中嵌入 EMD 映射信息的默认行为。

使数据在中间层上可用

  1. 在**“解决方案资源管理器”中,右击服务器项目 (RIAServicesExample.Web),选择“添加”,然后选择“新建项”**。

    此时将出现**“添加新项”**对话框。

  2. 在类别列表中,选择**“数据”,然后选择“ADO.NET 实体数据模型”**模板。

  3. 将新文件命名为 AdventureWorksModel.edmx,并单击**“添加”**。

    此时将出现**“实体数据模型向导”**。

  4. 在**“选择模型内容”屏幕上,选择“从数据库生成”选项,然后单击“下一步”**。

  5. 在**“选择您的数据连接”屏幕上,创建与数据库的数据连接,然后单击“下一步”**。

  6. 在**“选择数据库对象”屏幕上,依次选择“Address”“Customer”“CustomerAddress”**表。

  7. 确认**“在模型中加入外键列”复选框已默认选中,然后单击“完成”**。

    这将为表创建实体模型。

  8. 生成(使用组合键 Ctrl+Shift+B)该解决方案。

创建域服务

在本节中,您将向中间层项目添加域服务。域服务将向客户端项目公开服务器项目中的数据实体和操作。可以将业务逻辑添加到域服务以管理客户端与数据交互的方式。

创建域服务

  1. 右击服务器项目,依次选择**“添加”“新建项”**。

  2. 在类别列表中,选择**“Web”,然后选择“域服务类”**模板。

  3. 将类命名为 CustomerDomainService.cs(或 CustomerDomainService.vb)。

    RIA_AddDomainService

  4. 单击**“添加”**。

    此时将出现**“添加新的域服务类”**对话框。

  5. 确保选中**“启用客户端访问”**框。

  6. 选择**“Customer”实体,然后为它选中“启用编辑”**框。

    RIA_AddEntity

  7. 单击**“确定”**。

    这将在新的 CustomerDomainService.cs(或 CustomerDomainService.vb)文件中生成 CustomerDomainService 类。

  8. 打开此文件。请注意,此文件具有以下特征:

    • CustomerDomainService 类派生自 LinqToEntitiesDomainService 类,后者是 RIA Services 框架中的抽象基类。此基类将自动使用,因为域服务会公开一个 ADO.NET 实体数据类。

    • 泛型基类会绑定到在前面的步骤中由 ObjectContext 类型的 AdventureWorksLTEntities 在其泛型参数中创建的实体类。

    • CustomerDomainService 类是用 EnableClientAccessAttribute 特性标记的,以指示它对客户端层可见。

    • 将生成名为 GetCustomers 的查询方法。此方法将在不进行任何筛选或排序的情况下返回每个项目。

    • 已生成用于从记录插入、更新和删除客户的方法。

创建 Silverlight 客户端

在其他演练中,将为您演示如何向域服务添加业务逻辑。在本演练中,您将只使用默认情况下生成的 GetCustomers 方法。

在生成解决方案时将生成客户端代理类。利用客户端项目和服务器项目之间建立的 RIA Services 链接,可以生成此代码。这些客户端代理类将提供对客户端中的数据的访问。

查看生成的客户端代理类

  1. 生成解决方案。

    生成解决方案时,将在客户端项目中生成代码。

  2. 在**“解决方案资源管理器”中,选择“RIAServicesExample”客户端项目,然后单击窗口顶部的“显示所有文件”**图标。

    请注意,Generated_Code 文件夹包含 RIAServicesExample.Web.g.cs(或 RIAServicesExample.Web.g.vb)文件。

    RIA_GeneratedCode

  3. 在 Generated_Code 文件夹中打开代码文件。

    请注意,此文件具有以下特征:

    • 将生成派生自 WebContextBase 类的 WebContext 类。

    • 将生成派生自 DomainContext 类的 CustomerDomainContext 类。此类具有一个名为 GetCustomersQuery 的方法,该方法对应于域服务中创建的查询方法。

    • 将为域服务所公开的实体生成派生自 Entity 类的 Customer 类。客户端项目中的 Customer 实体类将匹配服务器上的 Customer 实体。

在 Silverlight 客户端中显示数据

  1. 打开 MainPage.xaml。

  2. 从左侧的**“工具箱”**中,将 DataGrid 控件拖动到 XAML 视图中的 Grid 元素内。

    从**“工具箱”拖动“DataGrid”**控件将导致自动添加命名空间 using System.Windows.Controls 语句和对 System.Windows.Controls.Data 程序集的引用。

    Caution警告:
    如果添加 DataGrid 而不从“工具箱”拖动它,则必须将对 System.Windows.Controls.Data 程序集的引用添加到客户端项目,并手动将 using 语句添加到代码隐藏文件中。
  3. AutoGeneratedColums 的值更改为 True,将 DataGrid 元素命名为 CustomerGrid,并调整高度和宽度特性,如下面的 XAML 所示。

    <UserControl 
        xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  
        x:Class="RIAServicesExample.MainPage"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="https://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="https://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>
    
  4. 打开 MainPage.xaml 的代码隐藏文件。

  5. using (C#) 或 Imports (Visual Basic) 添加两个语句:using RIAServicesExample.Web;using System.ServiceModel.DomainServices.Client;

    RIAServicesExample.Web 命名空间是一个包含为 RIAServicesExample.Web.g.cs(或 RIAServicesExample.Web.g.vb)中的客户端项目生成的代码的命名空间。

  6. 若要实例化 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;
            }
        }
    }
    
  7. 通过使用 LoadOperation 调用 GetCustomersQuery 方法来检索客户实体:LoadOperation<Customer> loadOp = this._customerContext.Load(this._customerContext.GetCustomersQuery());

  8. 使用 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;
            }
        }
    }
    
  9. 运行 (F5) 该应用程序。

    您应看到与下面类似的数据网格。

    RIA_ResultsGrid

后续步骤

本演练只演示从域服务创建项目和检索未筛选数据的基本步骤。以下是为便于您了解其他功能提出的一些建议:

  • 创建自定义查询方法(例如,接受参数的查询),这些查询方法通常用于筛选数据。有关更多信息,请参见演练:添加查询方法

  • 向包含更新、插入和删除方法且管理数据修改过程的域服务添加业务逻辑。有关更多信息,请参见如何:向域服务添加业务逻辑