次の方法で共有


チュートリアル: エンティティ クラスの挿入、更新、削除の動作をカスタマイズする

DataSet クラスと関連クラスは、アプリケーションがデータベースから切断されている間にアプリケーションがメモリ内のデータを操作できるようにする、2000 年代初頭のレガシ .NET Framework テクノロジです。 このテクノロジは、ユーザーがデータを変更し、変更をデータベースに保持できるアプリに特に役立ちます。 データセットは実証済みの成功したテクノロジですが、新しい .NET アプリケーションには Entity Framework Core を使用することをお勧めします。 Entity Framework は、オブジェクト モデルとして表形式データを操作するより自然な方法を提供し、よりシンプルなプログラミング インターフェイスを備えています。

Visual Studio の LINQ to SQL ツールは、データベース内のオブジェクトに基づく LINQ to SQL クラス (エンティティ クラス) を作成および編集するためのビジュアル デザイン サーフェイスを提供します。 LINQ to SQL を使用すると、LINQ テクノロジを使用して SQL データベースにアクセスできます。 詳細については、「 LINQ (言語統合クエリ)」を参照してください。

既定では、更新を実行するロジックは LINQ to SQL ランタイムによって提供されます。 ランタイムは、テーブルのスキーマ (列定義と主キー情報) に基づいて、既定の InsertUpdate、および Delete ステートメントを作成します。 既定の動作を使用しない場合は、更新動作を構成し、データベース内のデータを操作するために必要な挿入、更新、および削除を実行するための特定のストアド プロシージャを指定できます。 これは、エンティティ クラスがビューにマップされている場合など、既定の動作が生成されない場合にも実行できます。 また、データベースでストアド プロシージャを介したテーブル アクセスが必要な場合は、既定の更新動作をオーバーライドできます。 詳細については、 ストアド プロシージャを使用した操作のカスタマイズを参照してください。

このチュートリアルでは、Northwind データベースの InsertCustomerUpdateCustomerDeleteCustomer ストアド プロシージャを使用できる必要があります。

このチュートリアルでは、ストアド プロシージャを使用してデータをデータベースに保存するための既定の LINQ to SQL ランタイム動作をオーバーライドするために従う必要がある手順について説明します。

このチュートリアルでは、次のタスクを実行する方法について説明します。

  • 新しい Windows フォーム アプリケーションを作成し、LINQ to SQL ファイルを追加します。

  • Northwind Customers テーブルにマップされるエンティティ クラスを作成します。

  • LINQ to SQL Customer クラスを参照するオブジェクト データ ソースを作成します。

  • Customer クラスにバインドされる DataGridView を含む Windows フォームを作成します。

  • フォームの保存機能を実装します。

  • O/R デザイナーにストアド プロシージャを追加して、DataContextメソッドを作成します。

  • ストアド プロシージャを使用して挿入、更新、および削除を実行するように、 Customer クラスを構成します。

[前提条件]

このチュートリアルでは、SQL Server Express LocalDB と Northwind サンプル データベースを使用します。

  1. SQL Server Express LocalDB がない場合は、 SQL Server Express のダウンロード ページまたは Visual Studio インストーラーからインストールします。 Visual Studio インストーラーでは、データ ストレージと処理ワークロードの一部として、または個々のコンポーネントとして SQL Server Express LocalDB をインストールできます。

  2. 次の手順に従って Northwind サンプル データベースをインストールします。

    1. Visual Studio で、 SQL Server オブジェクト エクスプローラー ウィンドウを開きます。 (SQL Server オブジェクト エクスプローラーは、Visual Studio インストーラーデータ ストレージと処理ワークロードの一部としてインストールされます)。SQL Server ノードを展開します。 LocalDB インスタンスを右クリックし、[ 新しいクエリ] を選択します。

      クエリ エディター ウィンドウが開きます。

    2. Northwind Transact-SQL スクリプトをクリップボードにコピーします。 この T-SQL スクリプトは、Northwind データベースを最初から作成し、データを設定します。

    3. T-SQL スクリプトをクエリ エディターに貼り付け、[ 実行] ボタンを選択します。

      しばらくすると、クエリの実行が完了し、Northwind データベースが作成されます。

アプリケーションの作成と LINQ to SQL クラスの追加

LINQ to SQL クラスを使用し、Windows フォームにデータを表示しているため、新しい Windows フォーム アプリケーションを作成し、LINQ to SQL クラス ファイルを追加します。

この記事の手順は、Visual Studio で使用できる対話型開発エクスペリエンス (IDE) の最新バージョンについて説明しています。 お使いのコンピューターでは、一部のユーザー インターフェイス要素に異なる名前や場所が表示される場合があります。 また、Visual Studio のバージョンや環境設定がお使いのものと異なる可能性があります。 詳細については、「IDEのカスタマイズ」を参照してください。

LINQ to SQL クラスを含む新しい Windows フォーム アプリケーション プロジェクトを作成するには

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

  2. 左側のウィンドウで Visual C# または Visual Basic を展開し、 Windows デスクトップを選択します。

  3. 中央のウィンドウで、 Windows フォーム アプリ プロジェクトの種類を選択します。

  4. プロジェクト に UpdatingWithSProcsWalkthrough という名前を付け、[ OK] を選択します。

    UpdatingWithSProcsWalkthrough プロジェクトが作成され、ソリューション エクスプローラーに追加されます。

  5. [プロジェクト] メニューの [新しい項目の追加] クリックします。

  6. LINQ to SQL クラス テンプレートをクリックし、[名前] ボックスに「Northwind.dbml」と入力します。

  7. 追加をクリックします。

    空の LINQ to SQL クラス ファイル (Northwind.dbml) がプロジェクトに追加され、 O/R デザイナー が開きます。

Customer エンティティ クラスとオブジェクト データ ソースを作成する

サーバー エクスプローラーまたはデータベース エクスプローラーから O/R デザイナーにテーブルをドラッグして、データベース テーブルにマップされる LINQ to SQL クラスを作成します。 結果は、データベース内のテーブルにマップされる LINQ to SQL エンティティ クラスです。 エンティティ クラスを作成した後は、パブリック プロパティを持つ他のクラスと同様に、オブジェクト データ ソースとして使用できます。

Customer エンティティ クラスを作成し、それを使用してデータ ソースを構成するには

  1. サーバー エクスプローラーまたはデータベース エクスプローラーで、SQL Server バージョンの Northwind サンプル データベースで Customer テーブルを見つけます。

  2. [ 顧客 ] ノードを サーバー エクスプローラー または データベース エクスプローラー から *O/R デザイナー 画面にドラッグします。

    Customer という名前のエンティティ クラスが作成されます。 Customers テーブルの列に対応するプロパティがあります。 エンティティ クラスは Customers テーブルから 1 人の顧客を表すので、 Customer という名前 が付けられます ( Customers ではありません)。

    この名前変更の動作は 、複数形化と呼ばれます。 [ オプション] ダイアログ ボックスでオンまたはオフを切り替えることができます。 詳細については、「 方法: 複数形化のオンとオフを切り替える (O/R デザイナー)」を参照してください。

  3. [ ビルド ] メニューの [ Build UpdatingwithSProcsWalkthrough ] をクリックしてプロジェクトをビルドします。

  4. [ データ ソース ] ウィンドウを開くには、[ データ ] メニューの [ データ ソースの表示] をクリックします。

  5. [データ ソース] ウィンドウで、 [新しいデータ ソースの追加]をクリックします。

  6. [データ ソースの種類の選択] ページで [オブジェクト] をクリックし、[次へ] を選択します。

  7. UpdatingwithSProcsWalkthrough ノードを展開し、Customer クラスを見つけて選択します。

    Customer クラスを使用できない場合は、ウィザードから取り消し、プロジェクトをビルドして、ウィザードをもう一度実行します。

  8. [完了] をクリックしてデータ ソースを作成し、[データ ソース] ウィンドウにCustomer エンティティ クラスを追加します。

Windows フォームに顧客データを表示する DataGridView を作成する

LINQ to SQL データ ソース項目を [データ ソース] ウィンドウ から Windows フォームにドラッグして、エンティティ クラスにバインドされるコントロールを作成します。

エンティティ クラスにバインドされているコントロールを追加するには

  1. デザイン ビューで Form1 を開きます。

  2. [ データ ソース] ウィンドウから、 Customer ノードを Form1 にドラッグします。

    [データ ソース] ウィンドウを表示するには、[データ] メニューの [データ ソースの表示] をクリックします。

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

  4. フォームに次のコードを追加します。フォームに対してグローバルになるように、Form1 クラスの内部でありながら、どのメソッドにも属さない位置に追加します。

    private NorthwindDataContext northwindDataContext1
        = new NorthwindDataContext();
    
  5. Form_Load イベントのイベント ハンドラーを作成し、ハンドラーに次のコードを追加します。

    customerBindingSource.DataSource
        = northwindDataContext1.Customers;
    

保存機能を実装する

既定では、[保存] ボタンは有効ではなく、保存機能は実装されていません。 また、オブジェクト データ ソースのデータ バインド コントロールが作成されるときに、変更されたデータをデータベースに保存するコードは自動的に追加されません。 このセクションでは、LINQ to SQL オブジェクトの保存ボタンを有効にし、保存機能を実装する方法について説明します。

保存機能を実装するには

  1. デザイン ビューで Form1 を開きます。

  2. CustomerBindingNavigator の保存ボタン (フロッピー ディスク アイコン付きのボタン) を選択します。

  3. [ プロパティ ] ウィンドウで、 Enabled プロパティを True に設定 します

  4. [保存] ボタンをダブルクリックしてイベント ハンドラーを作成し、コード エディターに切り替えます。

  5. 保存ボタンのイベント ハンドラーに次のコードを追加します。

    northwindDataContext1.SubmitChanges();
    

更新 (挿入、更新、および削除) を実行するための既定の動作をオーバーライドする

既定の更新動作をオーバーライドするには

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

  2. サーバー エクスプローラーまたはデータベース エクスプローラーで、Northwind データベース ストアド プロシージャ ノードを展開し、InsertCustomersUpdateCustomers、および DeleteCustomers ストアド プロシージャを見つけます。

  3. 3 つのストアド プロシージャをすべて O/R デザイナーにドラッグします。

    ストアド プロシージャは、 DataContext メソッドとしてメソッド ペインに追加されます。 詳細については、「DataContext メソッド (O/R デザイナー)を参照してください。

  4. O/R デザイナーCustomer エンティティ クラスを選択します。

  5. [ プロパティ ] ウィンドウで、[ 挿入 ] プロパティを選択します。

  6. [ランタイムを使用する] の横にある省略記号 (...) をクリックして、[動作の構成] ダイアログ ボックスを開きます。

  7. カスタマイズを選択します。

  8. [カスタマイズ] リストの [InsertCustomers] メソッドを選択します。

  9. [ 適用 ] をクリックして、選択したクラスと動作の構成を保存します。

    各変更を行った後に [ 適用 ] をクリックすれば、クラス/動作の組み合わせごとに動作を引き続き構成できます。 [ 適用] をクリックする前にクラスまたは動作を変更すると、変更を適用する機会を提供する警告ダイアログ ボックスが表示されます。

  10. [動作] ボックスの一覧で [更新] を選択します。

  11. カスタマイズを選択します。

  12. [カスタマイズ] ボックスの一覧で UpdateCustomers メソッドを選択します。

    メソッド引数クラス プロパティの一覧を調べて、テーブル内の一部の列に対して 2 つのメソッド引数と 2 つのクラス プロパティがあることに注意してください。 これにより、変更を追跡し、コンカレンシー違反をチェックするステートメントを簡単に作成できます。

  13. Original_CustomerID メソッド引数を CustomerID (Original) クラス プロパティにマップします。

    既定では、名前が一致すると、メソッド引数はクラス プロパティにマップされます。 プロパティ名が変更され、テーブルとエンティティ クラスの間で一致しなくなった場合は、 O/R デザイナー が正しいマッピングを判断できない場合にマップする同等のクラス プロパティを選択する必要があります。 さらに、メソッド引数にマップする有効なクラス プロパティがない場合は、 クラス プロパティ の値を (None) に設定できます。

  14. [ 適用 ] をクリックして、選択したクラスと動作の構成を保存します。

  15. [削除][動作]一覧で選択します。

  16. カスタマイズを選択します。

  17. カスタマイズ リストで DeleteCustomers メソッドを選択します。

  18. Original_CustomerID メソッド引数を CustomerID (Original) クラス プロパティにマップします。

  19. OK をクリックします。

この特定のウォークスルーでは問題となりませんが、LINQ to SQL は、ID(自動インクリメント)、rowguidcol(データベースで生成されるグローバル一意識別子(GUID))、およびタイムスタンプ列に対して、挿入や更新の際にデータベースで生成された値を自動的に処理します。 他の列の型でデータベースによって生成された値は、予期せず null 値になります。 データベースで生成された値を返すには、IsDbGeneratedを手動で true に設定し、AutoSyncを AutoSync.AlwaysAutoSync.OnInsert、または AutoSync.OnUpdate のいずれかに設定する必要があります。

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

アプリケーションをもう一度実行して、 UpdateCustomers ストアド プロシージャがデータベース内の顧客レコードを正しく更新することを確認します。

  1. F5キーを押します。

  2. 更新動作をテストするには、グリッド内のレコードを変更します。

  3. 新しいレコードを追加して、挿入動作をテストします。

  4. [保存] ボタンをクリックして、変更内容をデータベースに保存します。

  5. フォームを閉じます

  6. F5 キーを押し、更新されたレコードと新しく挿入されたレコードが保持されていることを確認します。

  7. 手順 3 で作成した新しいレコードを削除して、削除動作をテストします。

  8. [保存] ボタンをクリックして変更を送信し、削除されたレコードをデータベースから削除します。

  9. フォームを閉じます

  10. F5 キーを押し、削除されたレコードがデータベースから削除されたことを確認します。

    アプリケーションで SQL Server Express Edition を使用している場合、データベース ファイルの [出力ディレクトリにコピー ] プロパティの値によっては、手順 10 で F5 キーを押したときに変更が表示されないことがあります。

次のステップ

アプリケーションの要件に応じて、LINQ to SQL エンティティ クラスを作成した後に実行する必要がある手順がいくつかあります。 このアプリケーションに対して行うことができるいくつかの機能強化には、次のようなものがあります。