次の方法で共有


チュートリアル: RIA Services ソリューションの作成

このチュートリアルでは、AdventureWorksLT データベースからデータを取得し、表示先となる Silverlight クライアントで利用できるようにする WCF RIA サービス アプリケーションを作成します。データ ソースからデータにアクセスするには、中間層のサーバー上のさまざまなデータベース テーブルを表すエンティティ クラスを作成し、Silverlight クライアントがこの中間層エンティティにアクセスできるようにするドメイン サービスを作成して、データを表示します。このチュートリアルは、RIA サービス ドキュメントに含まれる他の多くのチュートリアルの出発点となります。

前提条件

このチュートリアル、および RIA サービス のドキュメントで紹介されている他のチュートリアルでは、WCF RIA サービス および WCF RIA サービス Toolkit に加え、Visual Studio 2010 や Silverlight の開発者向けランタイムと SDK など、前提条件となっているいくつかのプログラムが適切にインストールおよび構成されている必要があります。また、SQL Server 2008 R2 Express with Advanced Services をインストールして構成し、AdventureWorks OLTP と LT データベースをインストールすることも必要です。

これらの各前提条件を満たしているかどうかを確認するための詳細な手順については、「WCF RIA Services の前提条件」ノード内のトピックを参照してください。このチュートリアルを進める前に、トピックに記載されている手順に従って、この RIA サービス チュートリアルを実行するときに発生する問題をできるだけ最小限に抑えるようにします。

プロジェクト間に RIA Services リンクを使用したソリューションの作成

RIA Services ソリューションを設定するには

  1. Visual Studio 2010 で、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックして、新しい RIA サービス プロジェクトを作成します。

    [新しいプロジェクト] ダイアログ ボックスが表示されます。

  2. [インストールされたテンプレート][Silverlight][Silverlight アプリケーション] テンプレートをクリックし、新しいプロジェクトに RIAServicesExample という名前を付けます。

    RIA_StartProject

  3. [OK] をクリックします。

    [新しい Silverlight アプリケーション] ダイアログ ボックスが表示されます。

  4. ダイアログ ボックスの下部にある [WCF RIA サービスを有効にする] チェック ボックスをオンにします。このチェック ボックスをオンにすると、クライアント プロジェクトとサーバー プロジェクトの間に RIA サービス リンクが作成されます。

    RIA_CreateProjectwithLink

  5. [OK] をクリックして、ソリューションを作成します。

    このソリューションには、クライアント プロジェクトとサーバー プロジェクトの 2 つのプロジェクトが含まれています。クライアント プロジェクトには RIAServicesExample という名前が付けられ、プレゼンテーション層の作成に使用する Silverlight コードが含まれます。サーバー プロジェクトには RIAServicesExample.Web という名前が付けられ、中間層のコードが含まれます。

    RIA_ProjectsCreated

データ モデルの作成

ここでは、AdventureWorksLT データベースのデータを表す ADO.NET エンティティ クラスを作成します。RIA サービス では、さまざまなデータ モデリング クラスおよびデータ ソースが使用されます。RIA サービス を使用してデータにアクセスするためのオプションの詳細については、「データ」を参照してください。

Caution注意 :
Visual Studio 2010 で Entity Data Model (EMD) を使用する場合は、[モデルに外部キー列を含める] を選択する必要があります。既定では、Entity Data Model ウィザードを使用するときにこのオプションが選択されています。また、アセンブリに EMD マッピング情報を埋め込む際の既定の動作を使用する必要もあります。

データを中間層で使用できるようにするには

  1. ソリューション エクスプローラーで、サーバー プロジェクト RIAServicesExample.Web を右クリックし、[追加] をポイントして、[新しい項目] をクリックします。

    [新しい項目の追加] ダイアログ ボックスが表示されます。

  2. カテゴリの一覧で、[データ] をクリックし、[ADO.NET Entity Data Model] テンプレートをクリックします。

  3. 新しいファイルに AdventureWorksModel.edmx という名前を付け、[追加] をクリックします。

    Entity Data Model ウィザードが表示されます。

  4. [モデルのコンテンツの選択] 画面で、[データベースから生成] をクリックし、[次へ] をクリックします。

  5. [データ接続の選択] 画面で、データベースへのデータ接続を作成し、[次へ] をクリックします。

  6. [データベース オブジェクトの選択] 画面で、AddressCustomer、および CustomerAddress の各テーブルを選択します。

  7. [モデルに外部キー列を含める] チェック ボックスが既定でオンになっていることを確認し、[完了] をクリックします。

    テーブルのエンティティ モデルが作成されます。

  8. ソリューションをビルドします (Ctrl キーと Shift キーを押しながら B キーを押します)。

ドメイン サービスの作成

ここでは、中間層プロジェクトにドメイン サービスを追加します。ドメイン サービスは、サーバー プロジェクト内のデータ エンティティと操作をクライアント プロジェクトに公開します。ドメイン サービスにビジネス ロジックを追加すると、クライアントとデータの対話方法を管理できます。

ドメイン サービスを作成するには

  1. サーバー プロジェクトを右クリックし、[追加] をポイントして、[新しい項目] をクリックします。

  2. カテゴリの一覧で、[Web] をクリックし、[DomainService クラス] テンプレートをクリックします。

  3. クラスに CustomerDomainService.cs (または CustomerDomainService.vb) という名前を付けます。

    RIA_AddDomainService

  4. [追加] をクリックします。

    [新しいドメイン サービス クラスの追加] ダイアログ ボックスが表示されます。

  5. [クライアント アクセスを有効にする] チェック ボックスがオンになっていることを確認します。

  6. [Customer] エンティティを選択し、[編集を有効にする] チェック ボックスをオンにします。

    RIA_AddEntity

  7. [OK] をクリックします。

    新しい CustomerDomainService.cs ファイル (または CustomerDomainService.vb ファイル) に CustomerDomainService クラスが生成されます。

  8. このファイルを開きます。ファイルには次の特性があります。

    • CustomerDomainService クラスは LinqToEntitiesDomainService クラスから派生します。このクラスは、RIA サービス フレームワークの抽象基本クラスです。ドメイン サービスは ADO.NET エンティティ データ クラスを公開するため、この基本クラスは自動的に使用されました。

    • ジェネリックな基本クラスは、ジェネリック パラメーターの ObjectContext 型の AdventureWorksLTEntities によって、前の手順で作成されたエンティティ クラスにバインドされます。

    • CustomerDomainService クラスは、EnableClientAccessAttribute 属性でマークされ、クライアント層に表示されることを示します。

    • GetCustomers という名前のクエリ メソッドが生成されます。このメソッドは、フィルター処理と並べ替えを実行せずにすべての項目を返します。

    • レコードの顧客を挿入、更新、および削除するメソッドが生成されました。

Silverlight クライアントの作成

他のチュートリアルでは、ドメイン サービスにビジネス ロジックを追加する方法について説明します。このチュートリアルでは、既定で生成された GetCustomers メソッドを使用するだけです。

ソリューションをビルドすると、クライアント プロキシ クラスが生成されます。クライアント プロジェクトとサーバー プロジェクトの間に確立された RIA サービス リンクにより、このコードを生成できます。このようなクライアント プロキシ クラスにより、クライアントからデータにアクセスできます。

生成されたクライアント プロキシ クラスを表示するには

  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. 左側のツールボックスから XAML ビューの Grid 要素内に DataGrid コントロールをドラッグします。

    ツールボックスから DataGrid コントロールをドラッグすると、名前空間の using System.Windows.Controls ステートメントと System.Windows.Controls.Data アセンブリへの参照が自動的に追加されます。

    Caution注意 :
    DataGridツールボックスからドラッグせずに追加する場合は、System.Windows.Controls.Data アセンブリへの参照をクライアント プロジェクトに追加し、分離コード ファイル内に using ステートメントを手動で追加する必要があります。
  3. 次の XAML に示すように、AutoGeneratedColums の値を True に変更し、DataGrid 要素に CustomerGrid という名前を付け、高さと幅の属性を調整します。

    <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) の 2 つのステートメント (using RIAServicesExample.Web; および using System.ServiceModel.DomainServices.Client;) を追加します。

    RIAServicesExample.Web 名前空間は、RIAServicesExample.Web.g.cs (または RIAServicesExample.Web.g.vb) でクライアント プロジェクトに対して生成されたコードを含む名前空間です。

  6. CustomerDomainContext をインスタンス化するには、コード行 private CustomerDomainContext _customerContext = new CustomerDomainContext();MainPage クラスに追加します。

    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<Customer> loadOp = this._customerContext.Load(this._customerContext.GetCustomersQuery()); のように、LoadOperation を使用して GetCustomersQuery メソッドを呼び出します。

  8. DataGrid に読み込まれたエンティティを CustomerGrid.ItemsSource = loadOp.Entities; にバインドします。

    まとめると、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

次の手順

このチュートリアルでは、プロジェクトを作成し、ドメイン サービスからフィルター処理されていないデータを取得するための基本手順についてのみ説明しました。他の機能について習得するためのいくつかの提案を次に示します。

  • パラメーターを受け取るクエリなど、カスタマイズされたクエリ メソッドを作成します。このクエリ メソッドは通常、データのフィルター処理に使用されます。詳細については、「チュートリアル: クエリ メソッドの追加」を参照してください。

  • Update、Insert、および Delete の各メソッドを含み、データを変更するためのプロセスを管理するビジネス ロジックをドメイン サービスに追加します。詳細については、「方法: ドメイン サービスにビジネス ロジックを追加する」を参照してください。