次の方法で共有


チュートリアル: ASP.NET アプリケーションでのドメイン サービスの使用

ASP.NET が提供する DomainSourceControl コントロールは、データベースにアクセスし、ユーザーが作成、読み取り、更新、および削除 (CRUD) 操作を実行できるようにするために、GridView コントロールなどのデータ バインド コントロールによって使用されます。

ドメイン サービスを使用すると、特定のデータベース モデルからアプリケーションをデタッチできる点に注目してください。その結果、ビジネス ロジック、および別のモデルに容易に移植できるコードの作成に重点を置くことができるという利点があります。

WCF RIA サービス ドメイン サービスは、サーバーで実行され、クエリ、変更、およびカスタム操作のためのデータへのアクセスを制御するアプリケーション ロジックを記述するためのパターンを提供します。また、Silverlight クライアントと ASP.NET サーバー アプリケーションを統合して、データ検証、認証、役割などの一般的なタスクに対するエンド ツー エンドのサポートも提供します。

このチュートリアルでは、RIA サービス ドメイン サービスを使用して ASP.NET Web ページからデータベースにアクセスする方法について説明します。このチュートリアルでは ASP.NET のドメイン サービスについて説明しますが、ASP.NET 以外のアプリケーションでもドメイン サービスを使用できます。このチュートリアルでは、ASP.NET サーバーと Silverlight クライアント アプリケーションの統合については説明しません。

このチュートリアルには、次の手順が含まれています。

  • ASP.NET Web アプリケーションの作成

  • ドメイン サービスの使用

  • ドメイン サービスのテスト

前提条件

このチュートリアル、および 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 サービス チュートリアルを実行するときに発生する問題をできるだけ最小限に抑えるようにします。

ASP.NET Web アプリケーションの作成

ドメイン サービスを使用するには、データベースと対話できる ASP.NET Web アプリケーションを作成する必要があります。実行する必要がある手順は、次のとおりです。

  • Web アプリケーションの作成。これによって、ドメイン サービスを使用する環境が用意されます。

  • アプリケーションへのデータベースの追加。これによって、Web アプリケーションのデータベースを選択できます。

  • データベース モデルの作成。CLR 型のデータベース エンティティを含むモデルを作成します。これらの型は、データベースと対話するためにドメイン サービスによって使用されます。ADO.NET Entity Framework または LINQ to SQL データ モデルを使用できます。

ASP.NET Web アプリケーションを作成する方法を次の手順に示します。

ASP.NET Web アプリケーションを作成するには

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

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

  2. [インストールされたテンプレート][Visual C#] または [Visual Basic] を展開し、[Web] をクリックします。

  3. テンプレートの一覧で、[ASP.NET 空の Web アプリケーション] をクリックします。

  4. プロジェクトに UsingDomainService という名前を付け、場所を指定して、[OK] をクリックします。

  5. アプリケーションをビルドします。

データベースをアプリケーションに追加する方法を次の手順に示します。このデータベースには、表示および編集するためにアクセスするテーブルが含まれています。

データベースを Web アプリケーションに追加するには

  1. ソリューション エクスプローラーで、プロジェクト名を右クリックし、[追加][ASP.NET フォルダーの追加] を順にポイントして、[App_Data] をクリックします。

    App_Data フォルダーがプロジェクトに追加されます。

  2. App_Data フォルダーを右クリックし、[追加] をポイントして、[既存の項目] をクリックします。

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

  3. AdventureWorksLT データベース ファイル (AdventureWorksLT_Data.mdf) の場所を指定します。

    [既存項目の追加] ダイアログ ボックスを次の図に示します。

    ASP.NET ドメイン サービス クライアント: 既存項目の追加 D

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

    これにより、プロジェクトにデータベース ファイルのコピーが作成されます。詳細については、「方法: .MDF ファイルを使用して AdventureWorksLT データベースに接続する」を参照してください。

データベース テーブルを表すクラスを含むデータ モデルを作成する方法を次の手順に示します。このチュートリアルでは、ADO.NET Entity Framework データ モデルを使用します。ただし、LINQ to SQL データ モデルを使用することもできます。

データ モデルを作成するには

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

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

  2. [インストールされたテンプレート] で、[データ] をクリックします。

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

  4. データベース モデルに AdventureWorksLT.edmx という名前を付け、[追加] をクリックします。

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

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

    [モデルのコンテンツの選択] ダイアログ ボックスを次の図に示します。

    ASP.NET ドメイン サービス クライアント: モデルのコンテンツの選択

  6. [次へ] をクリックします。

  7. [データ接続の選択] 画面で、[アプリケーションがデータベースへの接続に使用するデータ接続] ボックスの一覧の [AdventureWorksLT_Data.mdf] をクリックします。

  8. [エンティティ接続設定に名前を付けて Web.Config に保存] チェック ボックスがオンになっていることを確認します。既定の接続文字列名はそのままにしておいてかまいません。

    [データ接続の選択] ダイアログ ボックスを次の図に示します。

    ASP.NET ドメイン サービス クライアント: データ接続の選択

  9. [次へ] をクリックします。

    モデルに追加するデータベース オブジェクトを指定するためのページが表示されます。

  10. [データベース オブジェクトの選択] 画面で、[テーブル] ノードを選択してデータベースのすべてのテーブルを選択します。

    [データベース オブジェクトの選択] ダイアログ ボックスを次の図に示します。

    ASP.NET ドメイン サービス クライアント: データベース オブジェクトの選択

  11. [モデルに外部キー列を含める] チェック ボックスがオンになっていることを確認します。既定のモデルの名前空間はそのままにしておいてかまいません。

  12. [完了] をクリックします。

    ADO.NET Entity Data Model デザイナーが表示されます。これで、AdventureWorksLT データベースを表すデータ モデルが作成されました。

  13. デザイナーを閉じます。

  14. アプリケーションをビルドします。

    ビルドすることによって、次の手順で、ドメイン サービスで AdventureWorksLT_DataEntities コンテキスト クラスを使用できるようになります。

ドメイン サービスの使用

この手順では、ASP.NET アプリケーションでドメイン サービスを使用するために実行する必要がある手順について説明します。実行する必要がある手順は、次のとおりです。

  • プロジェクトへのドメイン サービス クラスの追加。これによって、アプリケーションによる CRUD データベース操作の実行を可能にするクラスが作成されます。また、非常に重要な点として、ビジネス ロジックを追加できるようになります。このクラスは、サーバーまたは中間層で動作します。

  • ビジネス ロジックの作成。ドメイン サービス クラスにコード (ビジネス ロジック) を追加します。

  • DomainDataSource コントロールの宣言。ページ マークアップでこの手順を行って、ユーザーがデータベースと対話できるようにします。このコントロールは、クライアントまたはプレゼンテーション層で動作します。

プロジェクトにドメイン データ サービスを追加する方法を次の手順に示します。

プロジェクトにドメイン サービス クラスを追加するには

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

  2. [インストールされたテンプレート] で、[Web] をクリックします。

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

  4. ファイルに AdventureWorksDomainService.cs または AdventureWorksDomainService.vb という名前を付け、[追加] をクリックします。

    [新しいドメイン サービス クラスの追加] ダイアログ ボックスが表示されます。[ドメイン サービス クラス名] ボックスには、指定した名前が含まれています。

  5. [クライアント アクセスを有効にする] チェック ボックスをオンにします。

  6. [使用できる DataContext/ObjectContext クラス] ボックスの一覧の [AdventureWorksLT_DataEntities (Entity Framework)] をクリックします。ドロップダウン リストが空の場合、アプリケーションはビルドされていません。[新しいドメイン サービス クラスの追加] ダイアログ ボックスを閉じ、アプリケーションをビルドして、前の手順を繰り返します。 

  7. [エンティティ] ボックスの一覧の Product テーブルのチェック ボックスをオンにします。

  8. Product テーブルの [編集を有効にする] チェック ボックスをオンにします。

  9. [メタデータ用の関連クラスを生成する] チェック ボックスをオンにします。

    [新しいドメイン サービス クラスの追加] ダイアログ ボックスを次の図に示します。

    ASP.NET ドメイン サービス クライアント: 新しいドメイン サービス クラスの追加

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

    AdventureWorksDomainService クラスと関連メタデータ ファイルが作成されます。このクラスには、データベースの CRUD 操作を可能にするメソッドが含まれています。ビジネス ロジックを含むようにクラスとメタデータ ファイルの両方を変更できます。次の手順では、単純な例について説明します。プロジェクトへの参照は必要なアセンブリを含むように更新されていて、Web.config ファイルは必要な構成要素をすべて含むように更新されている点に注意してください。

  11. [ファイル] メニューの [すべてを保存] をクリックします。

ビジネス ロジックを含むように AdventureWorksDomainService クラスと関連メタデータ ファイルをカスタマイズする方法を次の手順に示します。カスタマイズは非常に単純ですが、実行できる変更について理解できます。

ビジネス ロジックを作成するには

  1. ソリューション エクスプローラーで、AdventureWorksDomainService.cs ファイルまたは AdventureWorksDomainService.vb ファイルを開きます。

  2. 次のコードに示すように、ListPrice フィールドの検証ロジックを含むように UpdateProduct メソッドを変更します。また、現在の日付を使用して ModifiedDate フィールドを更新します。

    public void UpdateProduct(Product currentProduct)
    {
      if ((currentProduct.EntityState == EntityState.Detached))
      {
        // Custom logic: set a lower limit for the price.
        if (currentProduct.ListPrice < 5)
          throw new ValidationException("The list price must be >= 5.");
        this.ObjectContext.Products.AttachAsModified(currentProduct,
           this.ChangeSet.GetOriginal(currentProduct));
        // Custom logic: set the date to the current value.
        currentProduct.ModifiedDate = DateTime.Today;
      }
    }
    
    Public Sub UpdateProduct(ByVal currentProduct As Product)
      If (currentProduct.EntityState = EntityState.Detached) Then
        ' Custom logic: set a lower limit for the price.
        If currentProduct.ListPrice < 5 Then
          Throw New ValidationException("The list price must be >= 5.")
        End If
        Me.ObjectContext.Products.AttachAsModified(currentProduct, _
          Me.ChangeSet.GetOriginal(currentProduct))
        ' Custom logic: set the date to the current value.
        currentProduct.ModifiedDate = DateTime.Today
      End If
    End Sub
    

    検証が失敗すると、例外が発生し、ユーザーに表示されるページにエラー メッセージが送信されます。

  3. 次のコードに示すように、Entity Framework が正しく機能するように、GetProducts メソッドを変更して順序付けのロジックを設定します。

    public IQueryable<Product> GetProducts()
    {
      return this.ObjectContext.Products.OrderBy(p => p.ProductID);
    } 
    
    Public Function GetProducts() As IQueryable(Of Product)
      Return Me.ObjectContext.Products.OrderBy(Function(p) p.ProductID)
    End Function
    
  4. ファイルを保存して閉じます。

  5. ソリューション エクスプローラーで、AdventureWorksDomainService.metadata.cs ファイルまたは AdventureWorksDomainService.metadata.vb ファイルを開きます。

  6. 次のコードに示すように、Color データ フィールド エンティティに Required 属性を追加します。

    この属性を指定して、データベースで許可されているようにデータ フィールドが空にならないようにします。ユーザーが空の文字列を入力した場合、エラーが発生します。

    [Required(AllowEmptyStrings=false, 
      ErrorMessage="Color is required")]
    public string Color{ get; set; }
    
    <Required(AllowEmptyStrings:=False, ErrorMessage:="Color is required")> _
    Public Property Color As String
    
  7. メタデータ ファイルを保存して閉じます。

  8. アプリケーションをビルドします。

ユーザーがデータベースと対話できるように、ページ マークアップで DomainDataSource コントロールを宣言する方法を次の手順に示します。

ページで DomainDataSource コントロールを宣言するには

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

  2. [インストールされたテンプレート] で、[Web] をクリックします。

  3. テンプレートの一覧で、[Web フォーム] をクリックします。

  4. ファイルに Default.aspx という名前を付け、[追加] をクリックします。

  5. デザイン ビューで Default.aspx を開きます。

  6. ツールボックス[全般] グループまたは [データ] グループから、DomainDataSource コントロールをページに追加します。

    DomainDataSource が表示されて、[DomainDataSource タスク] メニューが開きます。

    このコントロールが一覧に表示されない場合は、[ツール] メニューの [ツールボックス アイテムの選択] をクリックします。[ツールボックス アイテムの選択] ダイアログ ボックスで [.NET Framework コンポーネント] タブをクリックし、[DomainDataSource] チェック ボックスをオンにして、[OK] をクリックします。

  7. [DomainDataSource タスク] メニューの [データ ソースの構成] をクリックします。

    データ ソースの構成ウィザードが表示されます。

  8. [ドメイン サービスの選択] 画面の [ドメイン サービスの種類] ボックスで、UsingDomainService.AdventureWorksDomainService を作成したクラスを選択します。

    [ドメイン サービスの選択] 画面を次の図に示します。

    ASP.NET ドメイン サービス クライアント: ドメイン サービスの選択

  9. [次へ] をクリックします。

  10. [データ アクセスの構成] 画面で、IQueryable<Product> GetProducts() メソッドを選択します。

  11. [挿入を有効にする] チェック ボックス、[更新を有効にする] チェック ボックス、および [削除を有効にする] チェック ボックスをオンにします。

    [データ アクセスの構成] 画面を次の図に示します。

    ASP.NET ドメイン サービス クライアント: ドメイン アクセスの選択

  12. [完了] をクリックします。

  13. ツールボックスの [データ] タブから、GridView コントロールをページに追加します。

    GridView が表示されて、[GridView タスク] メニューが開きます。

  14. [GridView タスク] メニューの [データ ソースの選択] ボックスの一覧の [DomainDataSource1] をクリックします。

    これは、前の手順で作成した DomainDataSource コントロールの ID です。

  15. [GridView タスク] メニューの [列の編集] をクリックします。

    [フィールド] ダイアログ ボックスが表示されます。

  16. [自動生成フィールド] チェック ボックスをオフにします。

  17. [選択されたフィールド] ペインで、[Name][Color][ListPrice]、および [ModifiedDate] 以外のすべてのフィールドを削除します。

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

  19. 必要に応じて、[GridView タスク] メニューで、関連するチェック ボックスをオンにしてページング、並べ替え、および選択を有効にします。

  20. ファイルを保存し、ソース ビューに切り替えます。

  21. GridView を選択します。

  22. [プロパティ] ウィンドウで、DataKeyNames プロパティに、表示されないすべての列をコンマで区切って、「ProductID, ProductNumber, StandardCost,Size, Weight,ProductCategoryID, ProductModelID, SellStartDate, SellEndDate, DiscontinuedDate, ThumbNailPhotoFileName, rowguid」のように指定します。

    この作業は、CRUD 操作を実行するために DomainDataSource コントロールによって必要とされます。

  23. AutoGenerateEditButton プロパティを True に設定して、テーブルの行の編集および削除を有効にします。

  24. ソース ビューで、Columns 要素を次のマークアップに置き換えます。

    カスタム テンプレートを使用すると、このマークアップによって Color および ListPrice データ フィールドの値を検証してからポストバックでサーバーに送信することができます。また、行の削除を実行する前にユーザーのアクセス許可を確認する LinkButton 削除コントロールも作成されます。

      <Columns>
        <asp:TemplateField>
          <ItemTemplate>
            <asp:LinkButton ID="LinkButton1"  CommandName="Delete" Text="Delete"
              ForeColor="#333333"  OnClientClick='return confirm("Are you sure you want to delete this row?");'/>
          </ItemTemplate>
        </asp:TemplateField>
    
        <asp:CommandField ShowSelectButton="True" />
        <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
        <asp:TemplateField>
          <HeaderTemplate>Color</HeaderTemplate>
          <ItemTemplate>
            <%# Eval("Color") %>
          </ItemTemplate>
          <EditItemTemplate>
            <asp:TextBox ID="ColorID"  Text='<%# Bind("Color") %>'/>
            <cc1:DomainValidator ID="DomainValidator2"   DataField="Color"/>
          </EditItemTemplate>
        </asp:TemplateField>
    
        <asp:TemplateField>
          <HeaderTemplate>ListPrice</HeaderTemplate>
          <ItemTemplate>
            <%# Eval("ListPrice")%>
          </ItemTemplate>
          <EditItemTemplate>
            <asp:TextBox ID="ListPriceID"  Text='<%# Bind("ListPrice") %>'/>
            <cc1:DomainValidator ID="DomainValidator3"  DataField="ListPrice"/>
           </EditItemTemplate>
         </asp:TemplateField>
    
         <asp:BoundField DataField="ModifiedDate" HeaderText="ModifiedDate" SortExpression="ModifiedDate" />
      </Columns>
    
  25. GridView コントロールの前に次のマークアップを追加して、検証エラーが表示されるようにします。

    <asp:ValidationSummary ID="ValidationSummary1"  />
    <cc1:DomainValidator  ControlToValidate="GridView1"/>
    
  26. Default.aspx ファイルを保存します。

  27. アプリケーションをビルドします。

ドメイン サービスのテスト

この手順では、GridView コントロールを使用してドメイン サービスの機能をテストする方法について説明します。この手順では、次の点を確認します。

  • カスタム ビジネス ロジックを介したデータベースとの対話が、予期したとおりに機能すること。

  • ASP.NET によって、ユーザーがデータベース フィールドに加えた変更が実行されること。

  • ASP.NET によって、カスタム ロジックによって生成されたエラー メッセージが表示されること。

ドメイン サービスのテスト

  1. ソリューション エクスプローラーで、Default.aspx ページを右クリックし、[ブラウザーで表示] をクリックします。

    Product テーブルを表示するページがブラウザーに表示されます。

  2. 任意の行の [編集] をクリックし、5 未満の値を入力して ListPrice 列の値を変更します。

  3. 同じ行の [更新] をクリックします。

    フィールドに 5 以上の値を入力する必要があることを示すカスタム エラーが表示されます。

  4. 同じ行で、ListPrice 列に 5 より大きい値を入力します。

  5. 同じ行の [更新] をクリックします。

    ASP.NET によって、データベースの ListPrice および ModifiedDate データ フィールドが更新されます。

  6. 任意の行の [編集] をクリックし、空の文字列を入力して Color 列の値を変更します。

  7. 同じ行の [更新] をクリックします。

    ASP.NET によって、カスタム検証エラーが表示されます。

  8. 同じ行で、Color 列に空でない文字列値を入力します。

  9. 同じ行の [更新] をクリックします。

    ASP.NET によって、データベースの Color および ModifiedDate データ フィールドが更新されます。

参照

処理手順

方法: ドメイン サービスにビジネス ロジックを追加する

概念

RIA Services ソリューションの作成