チュートリアル : エンティティ クラスの挿入、更新、および削除の動作のカスタマイズ
更新 : November 2007
オブジェクト リレーショナル デザイナ (O/R デザイナ) は、データベース内のオブジェクトに基づく LINQ to SQL クラス (エンティティ クラス) を作成および編集するためのビジュアル デザイン サーフェイスを提供します。LINQ to SQL を使用すると、LINQ テクノロジを使用して SQL データベースにアクセスできます。詳細については、「統合言語クエリ (LINQ: Language-Integrated Query)」を参照してください。
既定では、更新を実行するロジックは LINQ to SQL ランタイムによって提供されます。ランタイムは、テーブルのスキーマ (列定義と主キー情報) に基づいて、既定の Insert、Update、および Delete の各ステートメントを作成します。既定の動作を使用しない場合は、更新動作を構成し、データベースのデータの操作に必要な Insert、Update、および Delete を実行する特定のストアド プロシージャを指定できます。この方法は、既定の動作が生成されていない場合、たとえばエンティティ クラスがビューにマップされている場合にも実行できます。また、データベースのテーブルへのアクセスには常にストアド プロシージャを通すようにすると、既定の更新動作をオーバーライドできます。詳細については、「ストアド プロシージャによる操作のカスタマイズ (LINQ to SQL)」を参照してください。
メモ : |
---|
このチュートリアルでは、Northwind データベースで InsertCustomer、UpdateCustomer、および DeleteCustomer の各ストアド プロシージャを使用できるようにしておく必要があります。これらのストアド プロシージャの作成方法の詳細については、「チュートリアル : Northwind の Customers テーブル用更新ストアド プロシージャの作成」を参照してください。 |
このチュートリアルでは、ストアド プロシージャを使用して、データベースにデータを保存する既定の LINQ to SQL ランタイムの動作をオーバーライドするために必要な手順を示します。
このチュートリアルでは、次のタスクを実行する方法を学習します。
新しい Windows フォーム アプリケーションを作成し、LINQ to SQL ファイルを追加します。
Northwind の Customers テーブルにマップされるエンティティ クラスを作成します。
LINQ to SQL Customer クラスを参照するオブジェクト データ ソースを作成します。
Customer クラスにバインドされる DataGridView を含む Windows フォームを作成します。
フォームの保存機能を実装します。
O/R デザイナにストアド プロシージャを追加することにより、DataContext のメソッドを作成します。
ストアド プロシージャを使用して挿入、更新、および削除を実行するように Customer クラスを構成します。
前提条件
このチュートリアルを完了するには、次の条件が必要です。
Northwind サンプル データベースの SQL Server バージョンにアクセスします。詳細については、「方法 : サンプル データベースをインストールする」を参照してください。
Northwind データベースに InsertCustomer、UpdateCustomer、および DeleteCustomer の各ストアド プロシージャが必要です。詳細については、「チュートリアル : Northwind の Customers テーブル用更新ストアド プロシージャの作成」を参照してください。
アプリケーションの作成と LINQ to SQL クラスの追加
LINQ to SQL クラスを操作してデータを Windows フォームに表示できるように、新しい Windows フォーム アプリケーションを作成し、LINQ to SQL クラス ファイルを追加します。
メモ : |
---|
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。 |
LINQ to SQL クラスを含む新しい Windows アプリケーション プロジェクトを作成するには
[ファイル] メニューで新しいプロジェクトを作成します。
プロジェクトに「UpdatingwithSProcsWalkthrough」という名前を付けます。
メモ : O/R デザイナは Visual Basic プロジェクトと C# プロジェクトでサポートされています。したがって、新しいプロジェクトはこれらの言語のどちらかで作成してください。
[Windows フォーム アプリケーション] テンプレートをクリックし、[OK] をクリックします。詳細については、「Windows ベースのアプリケーションの作成」を参照してください。
UpdatingwithSProcsWalkthrough プロジェクトが作成されてソリューション エクスプローラに追加されます。
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
[LINQ to SQL クラス] テンプレートをクリックし、[名前] ボックスに「Northwind.dbml」と入力します。
[追加] をクリックします。
プロジェクトに空の LINQ to SQL クラス ファイル (Northwind.dbml) が追加され、O/R デザイナが開きます。
Customer エンティティ クラスとオブジェクト データ ソースの作成
サーバー エクスプローラまたはデータベース エクスプローラから O/R デザイナにテーブルをドラッグして、データベース テーブルにマップされた LINQ to SQL クラスを作成します。結果は、データベース内のテーブルにマップされた LINQ to SQL エンティティ クラスになります。作成したエンティティ クラスは、パブリック プロパティを持つ他のクラスと同様に、オブジェクト データ ソースとして使用できます。
Customer エンティティ クラスを作成し、そのエンティティ クラスでデータ ソースを構成するには
サーバー エクスプローラまたはデータベース エクスプローラで、SQL Server バージョンの Northwind サンプル データベース上の Customer テーブルを探します。詳細については、「方法 : Northwind データベースへのデータ接続を作成する」を参照してください。
サーバー エクスプローラまたはデータベース エクスプローラから O/R デザイナ サーフェイスに [Customers] ノードをドラッグします。
Customer という名前のエンティティ クラスが作成されます。これには、Customers テーブルの列に対応するプロパティが含まれています。このエンティティ クラスは Customers テーブルの 1 人の顧客を表すため、Customers ではなく Customer という名前が付けられます。
メモ : このような名前の変更動作を複数形化と呼びます。これは [オプション] ダイアログ ボックス (Visual Studio) でオンまたはオフにできます。詳細については、「方法 : 複数形化をオンおよびオフにする (O/R デザイナ)」を参照してください。
[ビルド] メニューの [UpdatingwithSProcsWalkthrough のビルド] をクリックして、プロジェクトをビルドします。
[データ] メニューの [データ ソースの表示] をクリックします。
[データ ソース] ウィンドウで、[新しいデータ ソースの追加] をクリックします。
[データソースの種類を選択] ページで、[オブジェクト] をクリックし、[次へ] をクリックします。
[UpdatingwithSProcsWalkthrough] ノードを展開し、[Customer] クラスを探して選択します。
メモ : Customer クラスが使用可能でない場合は、ウィザードをキャンセルし、プロジェクトをビルドしてからウィザードを再実行します。
[完了] をクリックしてデータ ソースを作成し、Customer エンティティ クラスを [データ ソース] ウィンドウに追加します。
Windows フォームに顧客データを表示するための DataGridView の作成
[データ ソース] ウィンドウから Windows フォームに LINQ to SQL データ ソース項目をドラッグして、エンティティ クラスにバインドされるコントロールを作成します。
エンティティ クラスにバインドされるコントロールを追加するには
デザイン ビューで [Form1] を開きます。
[データ ソース] ウィンドウから [Form1] に [Customer] ノードをドラッグします。
メモ : [データ ソース] ウィンドウを表示するには、[データ] メニューの [データ ソースの表示] をクリックします。
コード エディタで [Form1] を開きます。
フォームに次のコードを追加します。フォームに対してグローバルになるように、Form1 クラスの内部でありながら、どのメソッドにも属さない位置に追加します。
Private NorthwindDataContext1 As New NorthwindDataContext
private NorthwindDataContext northwindDataContext1 = new NorthwindDataContext();
Form_Load イベントのイベント ハンドラを作成し、ハンドラに次のコードを追加します。
CustomerBindingSource.DataSource = NorthwindDataContext1.Customers
customerBindingSource.DataSource = northwindDataContext1.Customers;
保存機能の実装
既定では、保存ボタンが有効ではなく、保存機能は実装されていません。また、オブジェクト データ ソースに対してデータ バインド コントロールを作成しても、変更されたデータをデータベースに保存するコードは自動的には追加されません。ここでは、保存ボタンを有効にし、LINQ to SQL オブジェクトの保存機能を実装する方法について説明します。
保存機能を実装するには
デザイン ビューで [Form1] を開きます。
CustomerBindingNavigator の保存ボタン (フロッピー ディスクのアイコンのボタン) を選択します。
[プロパティ] ウィンドウで、[Enabled] プロパティを [True] に設定します。
保存ボタンをダブルクリックして、イベント ハンドラを作成し、コード エディタに切り替えます。
保存ボタンのイベント ハンドラに次のコードを追加します。
NorthwindDataContext1.SubmitChanges()
northwindDataContext1.SubmitChanges();
更新 (Insert、Update、および Delete) の実行に対する既定の動作のオーバーライド
既定の更新動作をオーバーライドするには
O/R デザイナで LINQ to SQL ファイルを開きます (ソリューション エクスプローラで Northwind.dbml ファイルをダブルクリックします)。
サーバー エクスプローラまたはデータベース エクスプローラで、Northwind データベースの [ストアド プロシージャ] ノードを展開し、InsertCustomers、UpdateCustomers、および DeleteCustomers の各ストアド プロシージャを探します。
3 つのストアド プロシージャをすべて O/R デザイナにドラッグします。
各ストアド プロシージャが DataContext のメソッドとしてメソッド ペインに追加されます。詳細については、「DataContext メソッド (O/R デザイナ)」を参照してください。
O/R デザイナで [Customer] エンティティ クラスを選択します。
[プロパティ] ウィンドウで [Insert] プロパティを選択します。
[ランタイムを使用] の横にある省略記号 ([...]) をクリックして、[動作の構成] ダイアログ ボックスを開きます。
[カスタマイズ] を選択します。
[カスタマイズ] ボックスの一覧の [InsertCustomers] メソッドをクリックします。
[適用] をクリックして、選択したクラスと動作の構成を保存します。
メモ : 変更を行うたびに [適用] をクリックすると、各クラスと動作の組み合わせに対して動作の構成を続行できます。[適用] をクリックする前にクラスまたは動作を変更した場合は、警告ダイアログ ボックスが表示され、ここで変更を適用できます。
[動作] ボックスの一覧の [Update] をクリックします。
[カスタマイズ] を選択します。
[カスタマイズ] ボックスの一覧の [UpdateCustomers] メソッドをクリックします。
[メソッドの引数] および [クラスのプロパティ] の一覧を調べると、テーブルの一部の列には 2 つのメソッドの引数と 2 つのクラスのプロパティがあることがわかります。これにより、変更を追跡したり、同時実行違反をチェックするステートメントを作成したりすることが簡単になります。
Original_CustomerID メソッド引数を CustomerID (オリジナル) クラス プロパティにマップします。
メモ : 既定では、メソッド引数は名前が一致した場合にクラス プロパティにマップされます。プロパティ名が変更され、テーブルとエンティティ クラス間で一致しなくなったために、O/R デザイナが正しいマッピングを判断できないときは、マップ先となる同等のクラス プロパティを選択することが必要になる場合があります。また、メソッド引数のマップ先として有効なクラス プロパティがない場合は、[クラスのプロパティ] の値を [(なし)] に設定できます。
[適用] をクリックして、選択したクラスと動作の構成を保存します。
[動作] ボックスの一覧の [Delete] をクリックします。
[カスタマイズ] を選択します。
[カスタマイズ] ボックスの一覧の [DeleteCustomers] メソッドをクリックします。
Original_CustomerID メソッド引数を CustomerID (オリジナル) クラス プロパティにマップします。
[OK] をクリックします。
メモ : |
---|
この特定のチュートリアルに限った問題ではありませんが、LINQ to SQL は、ID 列 (自動インクリメント)、rowguidcol 列 (データベースが生成した GUID)、およびタイムスタンプ列であれば、データベースによって生成された値を、挿入時および更新時に自動的に処理します。その他の列型のデータベースによって生成された値は、予想に反して null 値になります。データベースが生成した値を返すには、手動で IsDbGenerated を true に設定し、AutoSync を Always、OnInsert、または OnUpdate のいずれかに設定する必要があります。 |
アプリケーションのテスト
アプリケーションを再実行し、データベース内の顧客レコードが UpdateCustomers ストアド プロシージャによって正しく更新されることを確認します。
アプリケーションをテストするには
F5 キーを押します。
グリッド内のレコードを変更して、Update の動作をテストします。
新しいレコードを追加して、Insert の動作をテストします。
保存ボタンをクリックして、変更をデータベースに保存します。
フォームを閉じます。
F5 キーを押し、更新されたレコードと新しく挿入したレコードが永続化されていることを確認します。
手順 3. で作成した新しいレコードを削除して、Delete の動作をテストします。
保存ボタンをクリックして変更を送信し、削除されたレコードをデータベースから削除します。
フォームを閉じます。
F5 キーを押し、削除したレコードがデータベースから削除されていることを確認します。
メモ : アプリケーションで SQL Server Express Edition を使用している場合、データベース ファイルの [出力ディレクトリにコピー] プロパティの値によっては、手順 10. で F5 キーを押したときに変更が表示されない場合があります。詳細については、「方法 : プロジェクトでローカル データ ファイルを管理する」を参照してください。
次の手順
アプリケーションの要件に応じて、LINQ to SQL エンティティ クラスの作成後にいくつかの手順を実行することが必要な場合があります。このアプリケーションで行うことができる拡張には次のものがあります。
更新時の同時実行チェックを実装します。詳細については、「オプティミスティック同時実行の概要 (LINQ to SQL)」を参照してください。
LINQ クエリを追加してデータをフィルタ処理します。詳細については、「LINQ クエリの概要」を参照してください。
参照
処理手順
方法 : 更新、挿入、および削除を実行するストアド プロシージャを割り当てる (O/R デザイナ)