ストアド プロシージャは 、O/R デザイナー に追加して、一般的な DataContext メソッドとして実行できます。 また、エンティティ クラスからデータベースに変更を保存するときに (たとえば、 SubmitChanges メソッドを呼び出すときに) 挿入、更新、および削除を実行する既定の LINQ to SQL ランタイム動作をオーバーライドするために使用することもできます。
注
ストアド プロシージャからクライアントに返送する必要がある値 (ストアド プロシージャで計算された値など) が返される場合は、ストアド プロシージャに出力パラメーターを作成します。 出力パラメーターを使用できない場合は、O/R デザイナーによって生成されたオーバーライドに依存するのではなく、部分的なメソッド実装を記述します。 データベースで生成された値にマップされたメンバーは、 INSERT
または UPDATE
操作が正常に完了した後、適切な値に設定する必要があります。 詳細については、「 既定の動作のオーバーライドにおける開発者の責任」を参照してください。
注
LINQ to SQL は、ID (自動インクリメント)、rowguidcol (データベース生成グローバル一意識別子 (GUID)))、タイムスタンプ列に対してデータベース生成値を自動的に処理します。 他の列の型でデータベースによって生成された値は、予期せず null 値になります。 データベースで生成された値を返すには、手動でIsDbGeneratedを true に設定し、AutoSyncを AutoSync.Always、AutoSync.OnInsert、または AutoSync.OnUpdate のいずれかに設定する必要があります。
エンティティ クラスの更新動作を構成する
既定では、LINQ to SQL エンティティ クラスのデータに加えられた変更を使用してデータベースを更新 (挿入、更新、および削除) するロジックは、LINQ to SQL ランタイムによって提供されます。 ランタイムは、テーブルのスキーマ (列と主キーの情報) に基づいて、既定の INSERT
、 UPDATE
、および DELETE
コマンドを作成します。 既定の動作が望ましくない場合は、テーブル内のデータを操作するために必要な挿入、更新、および削除を実行するために特定のストアド プロシージャを割り当てることで、更新動作を構成できます。 これは、エンティティ クラスがビューにマップされている場合など、既定の動作が生成されない場合にも実行できます。 最後に、データベースでストアド プロシージャによるテーブル アクセスが必要な場合に、既定の更新動作をオーバーライドできます。
注
この記事の手順では、Visual Studio で使用できる対話型開発エクスペリエンス (IDE) の最新バージョンについて説明します。 コンピューターには、一部のユーザー インターフェイス要素に対して異なる名前または場所が表示される場合があります。 別のバージョンの Visual Studio または異なる環境設定を使用している可能性があります。 詳細については、「IDEのカスタマイズ」を参照してください。
エンティティ クラスの既定の動作をオーバーライドするストアド プロシージャを割り当てるには
デザイナーで LINQ to SQL ファイルを開きます。 (ソリューション エクスプローラーで
.dbml
ファイルをダブルクリックします)。サーバー エクスプローラーまたはデータベース エクスプローラーで、ストアド プロシージャを展開し、エンティティ クラスの Insert、Update、Delete コマンドに使用するストアド プロシージャを見つけます。
ストアド プロシージャを O/R デザイナーにドラッグします。
ストアド プロシージャは、 DataContext メソッドとしてメソッド ペインに追加されます。 詳細については、「 DataContext メソッド (O/R デザイナー)」を参照してください。
ストアド プロシージャを使用して更新を実行するエンティティ クラスを選択します。
[ プロパティ ] ウィンドウで、オーバーライドするコマンド (挿入、 更新、または削除) を選択 します。
[ ランタイムを使用 する] という単語の横にある省略記号 (...) をクリックして、[ 動作の構成 ] ダイアログ ボックスを開きます。
カスタマイズを選択します。
[カスタマイズ] ボックスの一覧で目的のストアド プロシージャを選択します。
メソッド引数とクラス プロパティの一覧を調べて、メソッド引数が適切なクラス プロパティにマップされていることを確認します。 元のメソッド引数 (
Original_<ArgumentName>
) を、Update
コマンドとDelete
コマンドの元のプロパティ (<PropertyName> (Original)
) にマップします。注
既定では、名前が一致すると、メソッド引数はクラス プロパティにマップされます。 変更されたプロパティ名がテーブルとエンティティ クラスの間で一致しなくなった場合は、デザイナーが正しいマッピングを判断できない場合にマップする同等のクラス プロパティを選択する必要があります。
[OK] または [適用] をクリックします。
注
各変更を行った後に [ 適用 ] をクリックすれば、クラスと動作の組み合わせごとに動作を引き続き構成できます。 [ 適用] をクリックする前にクラスまたは動作を変更すると、警告ダイアログ ボックスが表示され、変更を適用できます。
更新に既定のランタイム ロジックを使用するように戻すには、[プロパティ] ウィンドウの [挿入]、[更新]、または [削除] コマンドの横にある省略記号をクリックし、[動作の構成] ダイアログ ボックスで [ランタイムの使用] を選択します。