次の方法で共有


チュートリアル : エンティティ クラスへの検証の追加

更新 : November 2007

データの検証とは、データ オブジェクトに入力された値が、アプリケーションに対して設定された規則に従っていること、およびオブジェクトのスキーマ内の制約に従っていることを確認するプロセスです。基になるデータベースに更新を送信する前にデータを検証すると、エラーが少なくなり、アプリケーションとデータベースの間で生じる可能性のあるラウンド トリップの回数も減ります。

オブジェクト リレーショナル デザイナ (O/R デザイナ) では、部分メソッドがサポートされており、これを使用することで、完全なエンティティの挿入、更新、および削除の処理中や、個々の列の変更中および変更後に実行される、デザイナで生成されたコードをユーザーが拡張できます。

このチュートリアルでは、LINQ to SQL エンティティ クラスに検証を追加する方法の詳細な手順を示し、「チュートリアル : LINQ to SQL クラスの作成 (O/R デザイナ)」トピックについて詳しく説明します。

このチュートリアルでは、次のタスクを実行する方法を学びます。

  • 特定の列のデータの変更に関する検証の追加

  • エンティティ全体への更新の検証の追加

前提条件

このチュートリアルを完了するには、次の条件が必要です。

Bb629301.alert_note(ja-jp,VS.90).gifメモ :

お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。

ORDesignerWalkthrough ソリューションを開く

ORDesignerWalkthrough ソリューションを開くには

特定の列の値の変更に対する検証の追加

チュートリアルのこの部分では、注文の RequiredDate 列に検証ロジックを追加します。RequiredDate が現在の日付より前であることを確認するコードを追加します。検証はユーザー インターフェイスではなく実際のクラス定義で実行されるため、値によって検証が失敗する場合は例外がスローされます。

列の値の変更時にデータを検証するには

  1. O/R デザイナで Northwind.dbml を開きます (ソリューション エクスプローラで Northwind.dbml ファイルをダブルクリックします)。

  2. 注文の RequiredDate に検証を追加しようとしているので、デザイナで Order クラスを右クリックし、[コードの表示] をクリックします。

    コード エディタが開き、注文の部分クラスが表示されます。

  3. 部分 Order クラスにカーソルを置きます。

  4. Visual Basic プロジェクトの場合は、次の操作を行います。

    1. [メソッド名] の一覧 ("(宣言)" と表示されているコンボ ボックス) を展開します。

    2. [OnRequiredDateChanging] をクリックします。

    3. OnRequiredDateChanging メソッドが部分 Order クラスに追加されます。

    4. RequiredDate に入力された値が現在の日付より前でないことを確認するために、OnRequiredDataChanging メソッド内部に次のコードを追加します。

      If value.HasValue Then
          If value < Today Then
              Throw New Exception("Required Date cannot be in the past")
          End If
      End If
      

    C# プロジェクトの場合は、次の操作を行います。

    1. RequiredDate に入力された値が現在の日付より前でないことを確認するために、部分 Order クラスに次のコードを追加します。

      partial void OnRequiredDateChanging(System.DateTime? value)
      {
          if (value < System.DateTime.Today)
          {
              throw new System.Exception("Required Date cannot be in the past");
          }
      }
      

アプリケーションのテスト

検証ロジックをテストするには、アプリケーションを実行し、検証エラーを引き起こす値を入力する必要があります。

アプリケーションをテストするには

  1. F5 キーを押します。

  2. 注文を表示するグリッドで、注文の RequiredDate を現在より前の日付に変更し、別のレコードに移動して変更を受け入れます。

    新しい値は検証エラーを引き起こし、予想どおりに例外がスローされます。

  3. フォームを閉じます (デバッグを停止します)。

DataGridView での検証エラーの処理

アプリケーションをテストした結果、DataError イベントを処理するように開発者に求めるエラー メッセージが DataGridView から表示されました。次の手順では、このイベントの処理方法を示します。

DataGridView の検証エラーを処理するには

  1. コード エディタで Form1 を開きます。

  2. OrdersDataGridView を選択します。

  3. DataError イベントのイベント ハンドラを作成します。

  4. エラーを表示するコードを追加します。イベント ハンドラは次のようになります。

    Private Sub OrdersDataGridView_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles OrdersDataGridView.DataError
        MessageBox.Show(e.Exception.Message)
    End Sub
    
    private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
    {
        MessageBox.Show(e.Exception.Message);
    }
    

エンティティ クラスへの更新の検証の追加

変更時の値のチェックに加えて、エンティティ クラス全体の更新が試行されたときにデータを検証することもできます。更新の試行時の検証では、ビジネス ルールにおける必要性に応じて複数の列の値を比較できます。たとえば、次の手順は、運送料金が設定した制限値未満の場合に、適切な運送会社が使用されているかどうかを検証する方法を示しています。

エンティティ クラスの更新時にデータを検証するには

  1. O/R デザイナで Northwind.dbml を開きます (ソリューション エクスプローラで Northwind.dbml ファイルをダブルクリックします)。

  2. Order クラス全体の更新に対する検証を追加しようとしているので、アクセスする必要のある部分メソッドは、生成された DataContext クラス (NorthwindDataContext) にあります。O/R デザイナで空の領域を右クリックし、[コードの表示] をクリックします。

    NorthwindDataContext の部分クラスにコード エディタが開きます。

  3. NorthwindDataset 部分クラスにカーソルを置きます。

  4. Visual Basic プロジェクトの場合は、次の操作を行います。

    1. [メソッド名] の一覧 ("(宣言)" と表示されているコンボ ボックス) を展開します。

    2. [UpdateOrder] をクリックします。

    3. UpdateOrder メソッドが部分 NorthwindDataContext クラスに追加されます。

    4. Federal Shipping では、Freight 値が 10 未満の場合は配送を行いません。そこで、次のコードを UpdateOrder メソッドの内部に追加して、Freight 値が 10 未満の場合は ShipVia に入力された値が Federal Shipping でないことを確認します。

      If (instance.ShipVia = 3) And (instance.Freight < 10) Then
          Dim ErrorMessage As String = "Federal Shipping " & _
           "does not deliver for less than 10. " & _
           "You must use a different shipper."
          Throw New Exception(ErrorMessage)
      End If
      

    C# プロジェクトの場合は、次の操作を行います。

    1. 次のコードを部分 NorthwindDataContext クラスに追加して、Freight 値が 10 未満の場合は ShipVia に入力された値が Federal Shipping でないことを確認します。

      partial void UpdateOrder(Order instance)
      {
          if ((instance.ShipVia == 3) && (instance.Freight < 10))
          {
              string ErrorMessage = "Federal Shipping " +
                  "does not deliver for less than 10. " +
                  "You must use a different shipper.";
              throw new System.Exception(ErrorMessage);
          }
      }
      

アプリケーションのテスト

検証ロジックをテストするには、アプリケーションを実行し、検証エラーを引き起こす値を入力します。

アプリケーションをテストするには

  1. F5 キーを押します。

  2. 注文を表示するグリッドで、ShipVia が 3 であるレコードを探します。Freight を「5」に変更し、別のレコードに移動して変更を受け入れます。

    レコードが実際に送信されて更新されるまで検証は行われないため、まだ検証エラーは発生しません。

  3. フォームの [Save] ボタンをクリックします。

    この時点では検証に失敗し、例外がスローされます。

  4. フォームを閉じます (デバッグを停止します)。

次の手順

アプリケーションの要件に応じて、LINQ to SQL エンティティ クラスへの検証の追加後にいくつかの手順を実行することが必要な場合があります。このアプリケーションに対して次の拡張を行うことができます。

  • データの並べ替えとフィルタ処理を行う別の LINQ クエリを作成します。詳細については、「LINQ to SQL クエリ」を参照してください。

参照

処理手順

チュートリアル : LINQ to SQL クラスの作成 (O/R デザイナ)

概念

データの新機能

LINQ to SQL クエリ

その他の技術情報

オブジェクト リレーショナル デザイナ (O/R デザイナ)

LINQ to SQL

LINQ to SQL のチュートリアル