チュートリアル : LINQ to SQL クラスの作成 (O/R デザイナー)
オブジェクト リレーショナル デザイナー (O/R デザイナー) は、データベース内のオブジェクトに基づく LINQ to SQL クラス (エンティティ クラス) を作成および編集するためのビジュアル デザイン サーフェイスを提供します。LINQ to SQL を使用すると、LINQ テクノロジを使用して SQL データベースにアクセスできます。 詳細については、「統合言語クエリ (LINQ: Language-Integrated Query)」を参照してください。
このチュートリアルでは、Northwind データベースの Customers テーブルおよび Orders テーブルにマップされる LINQ to SQL エンティティ クラスを作成し、Windows フォームにデータを表示するために必要な手順を示します。 テーブルのデータを表示する手順に加えて、データを LINQ クエリにバインドする手順も示します。 最後に、エンティティ クラスからデータベースに更新を送信する既定の LINQ to SQL のロジックを、ストアド プロシージャを使用して置き換える手順を示します。
このチュートリアルでは、次のタスクを実行する方法を学習します。
LINQ to SQL ファイルをプロジェクトに追加します。
データベース内の関連テーブルにマップされる新しいエンティティ クラスを作成します。
エンティティ クラスを参照するオブジェクト データ ソースを作成します。
エンティティ クラスにバインドされるコントロールを含む Windows フォームを作成します。
エンティティ クラスとデータベース間でデータの読み込みと保存を行うコードを追加します。
単純な LINQ クエリを作成し、フォームに結果を表示します。
O/R デザイナーにストアド プロシージャを追加します。
ストアド プロシージャを使用して挿入、更新、および削除を実行するようにエンティティ クラスを構成します。
必須コンポーネント
このチュートリアルを完了するには、次の条件が必要です。
Northwind サンプル データベースの SQL Server バージョンにアクセスします。 詳細については、「方法 : サンプル データベースをインストールする」を参照してください。
Northwind データベースに UpdateCustomer ストアド プロシージャが必要です。 詳細については、「チュートリアル : Northwind の Customers テーブル用更新ストアド プロシージャの作成」を参照してください。
Windows ベース アプリケーションの作成
ここでは、LINQ to SQL クラスを操作し、Windows フォームにデータを表示するので、このチュートリアルの最初の手順として、新しい Windows フォーム アプリケーションを作成します。
注意
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。
新しい Windows アプリケーション プロジェクトを作成するには
[ファイル] メニューで新しいプロジェクトを作成します。
プロジェクトに「ORDesignerWalkthrough」という名前を付けます。
注意
O/R デザイナーは Visual Basic プロジェクトと C# プロジェクトでサポートされているため、新しいプロジェクトはこれらの言語のどちらかで作成してください。
[Windows フォーム アプリケーション] テンプレートをクリックし、[OK] をクリックします。 詳細については、「Windows ベースのアプリケーションの作成」を参照してください。
ORDesignerWalkthrough プロジェクトが作成されてソリューション エクスプローラーに追加されます。
プロジェクトへの LINQ to SQL クラス ファイルの追加 (O/R デザイナーを開く)
エンティティ クラスを作成し、LINQ to SQL クラス ファイル (.dbml ファイル) に格納します。 .dbml ファイルを開くと、O/R デザイナーが開きます。[新しい項目の追加] ダイアログ ボックスで [LINQ to SQL クラス] テンプレートを選択して、プロジェクトに .dbml ファイルを追加します。
プロジェクトに .dbml ファイルを追加するには
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
[LINQ to SQL クラス] テンプレートをクリックし、[名前] ボックスに「Northwind.dbml」と入力します。
[追加] をクリックします。
プロジェクトに空の LINQ to SQL クラス ファイル (Northwind.dbml) が追加され、O/R デザイナーが開きます。
新しい LINQ to SQL ファイルをプロジェクトに追加すると、空のデザイン サーフェイスが開き、2 つに分割されたペインが表示されます。 左側のペインはエンティティ ペインであり、ここでエンティティ クラスを表示および構成します。 右側のペインは、デザイナーに追加された DataContext メソッドを表示するメソッド ペインです。 メソッド ペインが表示されない場合は、エンティティ ペインの空の領域を右クリックし、[メソッド ペインの表示] をクリックします。 空のサーフェイス全体は、構成の準備ができた DataContext を表します。 DataContext の名前は、.dbml ファイルに付けた名前に対応します。 このチュートリアルでは、LINQ to SQL ファイルに Northwind.dbml という名前を付けたので、DataContext は NorthwindDataContext という名前になります。 デザイナーの空の領域をクリックし、[プロパティ] ウィンドウを調べることで、これを確認できます。
注意
DataContext クラスには、データベースに接続し、データベース内のデータを操作する (たとえば、挿入、更新、および削除を実行する) ためのメソッドとプロパティが含まれています。 詳細については、「DataContext メソッド (O/R デザイナー)」を参照してください。
Customer エンティティ クラスと Order エンティティ クラスの作成
サーバー エクスプローラーまたはデータベース エクスプローラーから O/R デザイナーにテーブルをドラッグして、データベース テーブルにマップされた LINQ to SQL クラスを作成します。 結果は、データベース内のテーブルにマップされた LINQ to SQL エンティティ クラスになります。
O/R デザイナーに Customer エンティティ クラスを追加するには
サーバー エクスプローラーまたはデータベース エクスプローラーで、Northwind サンプル データベースの SQL Server バージョンのテーブルを探します。 詳細については、「方法 : Northwind データベースへのデータ接続を作成する」を参照してください。
サーバー エクスプローラーまたはデータベース エクスプローラーから O/R デザイナー サーフェイスに [Customers] ノードをドラッグします。
Customer という名前のエンティティ クラスが作成されます。 これには、Customers テーブルの列に対応するプロパティが含まれています。 このエンティティ クラスは Customers テーブルの 1 人の顧客を表すため、Customers ではなく Customer という名前が付けられます。
注意
このような名前の変更動作を複数形化と呼びます。 これは [オプション] ダイアログ ボックス (Visual Studio) でオンまたはオフにできます。 詳細については、「方法 : 複数形化をオンおよびオフにする (O/R デザイナー)」を参照してください。
サーバー エクスプローラーまたはデータベース エクスプローラーから O/R デザイナー サーフェイスに [Orders] ノードをドラッグします。
Order という名前のエンティティ クラスが、Customer エンティティ クラスへの Customer_Order 関連付け (リレーションシップ) と共に作成されます。 これには、Orders テーブルの列に対応するプロパティが含まれています。
注意
このエンティティ クラスは単一の注文を表すため、Order という名前になります。 親クラス (Customer) には、その特定の顧客の注文のコレクションを表す Orders プロパティがあります。 LINQ to SQL の関連付けの詳細については、「方法 : LINQ to SQL クラス間の関連付け (リレーションシップ) を作成する (O/R デザイナー)」を参照してください。
Customer エンティティ クラスでのオブジェクト データ ソースの作成
エンティティ クラスは、パブリック プロパティを持つ他のクラスと同様に、オブジェクト データ ソースとして使用できます。 これらは [データ ソース] ウィンドウに追加でき、そこからフォームにドラッグすることで、データ バインド コントロール (オブジェクトのパブリック プロパティの値にバインドされるコントロール) を作成できます。 エンティティ クラスを [データ ソース] ウィンドウに追加するには、データ ソース構成ウィザードを実行し、ウィザードでデータ ソースとして [オブジェクト] をクリックします。
[データ ソース] ウィンドウに Customer をオブジェクト データ ソースとして追加するには
[ビルド] メニューの [ORDesignerWalkthrough のビルド] をクリックして、プロジェクトをビルドします。
[データ] メニューの [データ ソースの表示] をクリックします。
[データ ソース] ウィンドウで、[新しいデータ ソースの追加] をクリックします。
[データソースの種類を選択] ページで、[オブジェクト] をクリックし、[次へ] をクリックします。
[ORDesignerWalkthrough] ノード (プロジェクトの名前のノード) を展開し、Customer クラスを探して選択します。
注意
Customer クラスが使用可能でない場合は、ウィザードをキャンセルし、プロジェクトをビルドしてからウィザードを再実行します。
[完了] をクリックしてデータ ソースを作成し、Customer エンティティ クラスを [データ ソース] ウィンドウに追加します。
Windows フォームにデータを表示するためのデータ バインド コントロールの作成
[データ ソース] ウィンドウから Windows フォームに LINQ to SQL のデータ ソース項目をドラッグして、エンティティ クラスにバインドされるコントロールを作成します。
エンティティ クラスにバインドされるコントロールを追加するには
デザイン ビューで [Form1] を開きます。
[データ ソース] ウィンドウから [Form1] に [Customer] ノードをドラッグします。
注意
[データ ソース] ウィンドウを表示するには、[データ] メニューの [データ ソースの表示] をクリックします。
[データ ソース] ウィンドウから [Form1] に [Orders] ノードをドラッグします。 これを CustomerDataGridView の下に配置します。
コード ビューで [Form1] を開きます。
フォームに次のコードを追加します。フォームに対してグローバルになるように、Form1 クラスの内部でありながら、どのメソッドにも属さない位置に追加します。
Private NorthwindDataContext1 As New NorthwindDataContext
private NorthwindDataContext northwindDataContext1 = new NorthwindDataContext();
Form_Load イベントのイベント ハンドラーを作成し、ハンドラーに次のコードを追加します。
CustomerBindingSource.DataSource = NorthwindDataContext1.Customers
customerBindingSource.DataSource = northwindDataContext1.Customers;
アプリケーションのテスト
アプリケーションを実行します。 この時点で、フォームには、Customers テーブルのデータを表示する 1 つの DataGridView と、選択された顧客の注文のデータを表示するもう 1 つの DataGridView が含まれます。
注意
保存ボタンが無効になっていることに注意してください。 保存機能は次のセクションで実装します。
アプリケーションをテストするには
F5 キーを押します。
データがグリッドに表示されることを確認します。
顧客を選択します。
表示されている注文が選択した顧客の注文であることを確認します。
フォームを閉じます ([デバッグ] メニューの [デバッグの停止] をクリックします)。
保存機能の実装
前に述べたように、既定では保存ボタンが有効ではなく、保存機能は実装されていません。 また、オブジェクト データ ソースに対してデータ バインド コントロールを作成しても、変更されたデータをフォームに保存するコードは自動的には追加されません。 ここでは、保存ボタンを有効にし、LINQ to SQL オブジェクトの保存機能を実装する方法について説明します。
保存機能を実装するには
デザイン ビューで [Form1] を開きます。
CustomerBindingNavigator の保存ボタンを選択します (フロッピー ディスクのアイコンのボタン)。
[プロパティ] ウィンドウで、[Enabled] プロパティを [True] に設定します。
保存ボタンをダブルクリックして、イベント ハンドラーを作成し、コード エディターに切り替えます。
保存ボタンのイベント ハンドラーに次のコードを追加します。
Try NorthwindDataContext1.SubmitChanges() Catch ex As Exception MessageBox.Show(ex.Message) End Try
try { northwindDataContext1.SubmitChanges(); } catch (Exception ex) { MessageBox.Show(ex.Message); }
アプリケーションのテスト
アプリケーションを実行します。 保存ボタンが有効になり、データを保存する機能が使用可能になります。
アプリケーションをテストするには
F5 キーを押します。
いずれかのグリッドでデータを変更します (処理中の変更をコミットするために、グリッドで編集した行から別の場所に移動してください)。
保存ボタンをクリックして変更をデータベースに保存します。
フォームを閉じます
F5 キーを押し、変更が永続化されたことを確認します (または、データベース内のテーブルを探して変更が保存されたことを確認します)。
LINQ クエリへのバインド
CustomerBindingSource は、DataContext にバインドする以外に、LINQ クエリに直接バインドすることもできます。 LINQ クエリの作成方法の詳細については、「LINQ クエリの概要 (C#)」を参照してください。
フォームへの Button と TextBox の追加
コントロールを LINQ クエリにバインドする方法を学習するために、クエリ パラメーターの入力を可能にするコントロールをフォームに追加し、クエリを実行します。
フォームにコントロールを追加するには
デザイン ビューで [Form1] を開きます。
フォームに TextBox を追加し、[Name] プロパティを「CityTextBox」に設定します。
フォームに Button を追加し、次のプロパティを設定します。
[Name] = RunQueryButton
[Text] = Run Query
LINQ クエリへのデータ バインド
LINQ クエリを実行するコードを追加します。 このクエリは、CityTextBox に入力された値をクエリ パラメーターとして使用します。
LINQ クエリにバインドするには
RunQueryButton をダブルクリックし、RunQueryButton_click イベント ハンドラーに次のコードを追加します。
Dim CustomersQuery = From customers in NorthwindDataContext1.Customers _ Where customers.City = CityTextBox.Text _ Select customers CustomerBindingSource.DataSource = CustomersQuery
var CustomersQuery = from customers in northwindDataContext1.Customers where customers.City == CityTextBox.Text select customers; customerBindingSource.DataSource = CustomersQuery;
アプリケーションのテスト
アプリケーションを実行します。 これで、特定の都市の顧客を照会できるようになります。
アプリケーションをテストするには
F5 キーを押します。
テキスト ボックスに「London」と入力します。
[Run Query] ボタンをクリックします。
City プロパティの値が London である顧客だけが表示されていることを確認します。
更新 (Insert、Update、および Delete) の実行に対する既定の動作のオーバーライド
既定では、更新を実行するロジックが LINQ to SQL ランタイムによって提供されます。ランタイムは、エンティティ クラスにデータを設定するために使用される Select ステートメントに基づいて、既定の Insert、Update、および Delete の各ステートメントを作成します。 既定の動作を使用しない場合は、更新動作を構成し、データベースのデータの操作に必要な Insert、Update、および Delete を実行する特定のストアド プロシージャを指定できます。 この方法は、既定の動作が生成されていない場合、たとえばエンティティ クラスが結合テーブルにマップされている場合にも実行できます。 また、データベースのテーブルへのアクセスには常にストアド プロシージャを通すようにすると、既定の更新動作をオーバーライドできます。
注意
ここでは、Northwind データベースで追加の InsertCustomer、UpdateCustomer、および DeleteCustomer の各ストアド プロシージャを使用できるようにしておく必要があります。 これらのストアド プロシージャの作成方法の詳細については、「チュートリアル : Northwind の Customers テーブル用更新ストアド プロシージャの作成」を参照してください。
既定の更新動作をオーバーライドするには
O/R デザイナーで LINQ to SQL ファイルを開きます (ソリューション エクスプローラーで Northwind.dbml ファイルをダブルクリックします)。
サーバー エクスプローラーまたはデータベース エクスプローラーで、Northwind データベースの [ストアド プロシージャ] ノードを展開し、UpdateCustomers ストアド プロシージャを探します。
UpdateCustomers ストアド プロシージャを O/R デザイナーにドラッグします。
UpdateCustomers ストアド プロシージャが DataContext のメソッドとしてメソッド ペインに追加されます。 詳細については、「DataContext メソッド (O/R デザイナー)」を参照してください。
O/R デザイナーで [Customer] エンティティ クラスを選択します。
[プロパティ] ウィンドウで、オーバーライドするコマンドを選択します ([Insert]、[Update]、または [Delete])。 この例では、[Update] プロパティを選択します。
[ランタイムを使用] の横にある省略記号 ([...]) をクリックして、[動作の構成] ダイアログ ボックスを開きます。
[カスタマイズ] を選択します。
[カスタマイズ] ボックスの一覧の [UpdateCustomers] メソッドをクリックします。
[メソッドの引数] および [クラスのプロパティ] の一覧を調べると、テーブルの一部の列には 2 つのメソッドの引数と 2 つのクラスのプロパティがあることがわかります。 これにより、変更を追跡したり、同時実行違反をチェックするステートメントを作成したりすることが簡単になります。
元のメソッド引数 (Original_ArgumentName) を元のプロパティ (PropertyName (オリジナル)) にマップします。 このチュートリアルでは、Original_CustomerID 引数を CustomerID (オリジナル) プロパティにマップする必要があります。
注意
既定では、メソッド引数は名前が一致した場合にクラス プロパティにマップされます。 プロパティ名が変更され、テーブルとエンティティ クラス間で一致しなくなったために、デザイナーが正しいマッピングを判断できないときは、マップ先となる同等のクラス プロパティを選択することが必要になる場合があります。 また、メソッド引数のマップ先として有効なクラス プロパティがない場合は、[クラスのプロパティ] 値を [(なし)] に設定できます。
[OK] をクリックします。
アプリケーションのテスト
アプリケーションを再実行し、データベース内の顧客レコードが UpdateCustomers ストアド プロシージャによって正しく更新されることを確認します。
アプリケーションをテストするには
F5 キーを押します。
ALFKI のグリッドで ContactName 列を探します。
名前を Maria Anders から Anders に変更します。
別の行に移動して変更をコミットします。
保存ボタンをクリックします。
フォームを閉じます
F5 キーを押してアプリケーションを再び実行し、ALFKI の ContactName 列に Anders しか表示されないことを確認します。
次の手順
アプリケーションの要件に応じて、LINQ to SQL エンティティ クラスの作成後にいくつかの手順を実行することが必要な場合があります。 このアプリケーションで行うことができる拡張には次のものがあります。
Insert コマンドおよび Delete コマンドで使用するストアド プロシージャを追加します。 詳細については、「方法 : 更新、挿入、および削除を実行するストアド プロシージャを割り当てる (O/R デザイナー)」を参照してください。
フィルター処理されたデータを返すために、さまざまな LINQ クエリを作成します。 詳細については、「方法 : クエリで情報を取得する (LINQ to SQL)」を参照してください。
参照
参照
概念
その他の技術情報
オブジェクト リレーショナル デザイナー (O/R デザイナー)
LINQ Documentation Roadmap