チュートリアル : エンティティ クラスへの検証の追加
データの検証とは、データ オブジェクトに入力された値が、アプリケーションに対して設定された規則に従っていること、およびオブジェクトのスキーマ内の制約に従っていることを確認するプロセスです。基になるデータベースに更新を送信する前にデータを検証すると、エラーが少なくなり、アプリケーションとデータベースの間で生じる可能性のあるラウンド トリップの回数も減ります。
オブジェクト リレーショナル デザイナー (O/R デザイナー) では、部分メソッドがサポートされており、これを使用することで、完全なエンティティの挿入、更新、および削除の処理中や、個々の列の変更中および変更後に実行される、デザイナーで生成されたコードをユーザーが拡張できます。
このチュートリアルでは、LINQ to SQL [LINQ to SQL] エンティティ クラスに検証を追加する方法の詳細な手順を示し、「チュートリアル : LINQ to SQL クラスの作成 (O/R デザイナー)」トピックについて詳しく説明します。
このチュートリアルでは、次のタスクを実行する方法を学びます。
特定の列のデータの変更に関する検証の追加
エンティティ全体への更新の検証の追加
必須コンポーネント
このチュートリアルを完了するには、次の条件が必要です。
「チュートリアル : LINQ to SQL クラスの作成 (O/R デザイナー)」で作成したプロジェクト。
Northwind サンプル データベースへのアクセス。詳細については、「方法 : サンプル データベースをインストールする」を参照してください。
注意
次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Customizing Development Settings in Visual Studio」を参照してください。
ORDesignerWalkthrough ソリューションを開く
ORDesignerWalkthrough ソリューションを開くには
[ファイル] メニューの [開く] をポイントし、[プロジェクト/ソリューション] をクリックして、ORDesignerWalkthrough.sln ファイルの場所に移動します。
注意
ORDesignerWalkthrough.sln ファイルは、「チュートリアル : LINQ to SQL クラスの作成 (O/R デザイナー)」トピックで作成され、このチュートリアルを実行するための前提条件となっています。まだ行っていない場合は、「チュートリアル : LINQ to SQL クラスの作成 (O/R デザイナー)」トピックを完了し、終了時にソリューションを保存してください。
特定の列の値の変更に対する検証の追加
チュートリアルのこの部分では、注文の RequiredDate 列に検証ロジックを追加します。RequiredDate が現在の日付より前であることを確認するコードを追加します。検証はユーザー インターフェイスではなく実際のクラス定義で実行されるため、値によって検証が失敗する場合は例外がスローされます。
列の値の変更時にデータを検証するには
O/R デザイナーで Northwind.dbml を開きます (ソリューション エクスプローラーで Northwind.dbml ファイルをダブルクリックします)。
注文の RequiredDate に検証を追加しようとしているので、デザイナーで Order クラスを右クリックし、[コードの表示] をクリックします。
コード エディターが開き、注文の部分クラスが表示されます。
部分 Order クラスにカーソルを置きます。
Visual Basic プロジェクトの場合は、次の操作を行います。
[メソッド名] の一覧 ("(宣言)" と表示されているコンボ ボックス) を展開します。
[OnRequiredDateChanging] をクリックします。
OnRequiredDateChanging メソッドが部分 Order クラスに追加されます。
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# プロジェクトの場合は、次の操作を行います。
RequiredDate に入力された値が現在の日付より前でないことを確認するために、部分 Order クラスに次のコードを追加します。
partial void OnRequiredDateChanging(System.DateTime? value) { if (value < System.DateTime.Today) { throw new System.Exception("Required Date cannot be in the past"); } }
アプリケーションのテスト
検証ロジックをテストするには、アプリケーションを実行し、検証エラーを引き起こす値を入力する必要があります。
アプリケーションをテストするには
F5 キーを押します。
注文を表示するグリッドで、注文の RequiredDate を現在より前の日付に変更し、別のレコードに移動して変更を受け入れます。
新しい値は検証エラーを引き起こし、予想どおりに例外がスローされます。
フォームを閉じます (デバッグを停止します)。
DataGridView での検証エラーの処理
アプリケーションをテストした結果、DataError イベントを処理するように開発者に求めるエラー メッセージが DataGridView から表示されました。次の手順では、このイベントの処理方法を示します。
DataGridView の検証エラーを処理するには
コード エディターで Form1 を開きます。
OrdersDataGridView を選択します。
DataError イベントのイベント ハンドラーを作成します。
エラーを表示するコードを追加します。イベント ハンドラーは次のようになります。
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); }
エンティティ クラスへの更新の検証の追加
変更時の値のチェックに加えて、エンティティ クラス全体の更新が試行されたときにデータを検証することもできます。更新の試行時の検証では、ビジネス ルールにおける必要性に応じて複数の列の値を比較できます。たとえば、次の手順は、運送料金が設定した制限値未満の場合に、適切な運送会社が使用されているかどうかを検証する方法を示しています。
エンティティ クラスの更新時にデータを検証するには
O/R デザイナーで Northwind.dbml を開きます (ソリューション エクスプローラーで Northwind.dbml ファイルをダブルクリックします)。
Order クラス全体の更新に対する検証を追加しようとしているので、アクセスする必要のある部分メソッドは、生成された DataContext クラス (NorthwindDataContext) にあります。O/R デザイナーで空の領域を右クリックし、[コードの表示] をクリックします。
NorthwindDataContext の部分クラスにコード エディターが開きます。
NorthwindDataset 部分クラスにカーソルを置きます。
Visual Basic プロジェクトの場合は、次の操作を行います。
[メソッド名] の一覧 ("(宣言)" と表示されているコンボ ボックス) を展開します。
[UpdateOrder] をクリックします。
UpdateOrder メソッドが部分 NorthwindDataContext クラスに追加されます。
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# プロジェクトの場合は、次の操作を行います。
次のコードを部分 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); } }
アプリケーションのテスト
検証ロジックをテストするには、アプリケーションを実行し、検証エラーを引き起こす値を入力します。
アプリケーションをテストするには
F5 キーを押します。
注文を表示するグリッドで、ShipVia が 3 であるレコードを探します。Freight を「5」に変更し、別のレコードに移動して変更を受け入れます。
レコードが実際に送信されて更新されるまで検証は行われないため、まだ検証エラーは発生しません。
フォームの [Save] ボタンをクリックします。
この時点では検証に失敗し、例外がスローされます。
フォームを閉じます (デバッグを停止します)。
次の手順
アプリケーションの要件に応じて、LINQ to SQL エンティティ クラスへの検証の追加後にいくつかの手順を実行することが必要な場合があります。このアプリケーションに対して次の拡張を行うことができます。
- データの並べ替えとフィルター処理を行う別の LINQ クエリを作成します。詳細については、「LINQ to SQL クエリ」を参照してください。
参照
処理手順
チュートリアル : LINQ to SQL クラスの作成 (O/R デザイナー)
概念
その他の技術情報
オブジェクト リレーショナル デザイナー (O/R デザイナー)