デザイナーのクエリ ストアド プロシージャ
このステップバイステップのチュートリアルでは、Entity Framework Designer (EF Designer) を使用してストアド プロシージャをモデルにインポートし、インポートされたストアド プロシージャを呼び出して結果を取得する方法について説明します。
Code First では、ストアド プロシージャまたは関数へのマッピングはサポートされていません。 ただし、ストアド プロシージャまたは関数は、System.Data.Entity.DbSet.SqlQuery メソッドを使用して呼び出すことができます。 次に例を示します。
var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]")`;
前提条件
このチュートリアルを完了するための要件を次に示します。
- 最新バージョンの Visual Studio。
- School サンプル データベース。
プロジェクトをセットアップする
- Visual Studio 2012 を開きます。
- [ファイル] -> [新規作成] -> [プロジェクト] の順に選択します。
- 左ペインで [Visual C#] をクリックし、[コンソール] テンプレートを選択します。
- 名前として「EFwithSProcsSample」と入力します。
- [OK] を選択します。
Create a Model (モデルの作成)
ソリューション エクスプローラーでプロジェクトを右クリックし、[追加] -> [新しい項目] の順に選択します。
左側のメニューから [データ] を選択し、[テンプレート] ペインの [ADO.NET Entity Data Model] を選択します。
ファイル名として「EFwithSProcsModel.edmx」と入力し、[追加] をクリックします。
[モデルのコンテンツの選択] ダイアログ ボックスで、[データベースから生成] を選択し、[次へ] をクリックします。
[新しい接続] をクリックします。
[接続のプロパティ] ダイアログ ボックスで、サーバー名 (例: (localdb)\mssqllocaldb) を入力し、認証方法を選択します。データベース名として「School」と入力し、[OK] をクリックします。
指定したデータベース接続設定に従って、[データ接続の選択] ダイアログ ボックスが更新されます。[データベース オブジェクトの選択] ダイアログ ボックスで、[テーブル] チェック ボックスをオンにしてすべてのテーブルを選択します。
また、[ストアド プロシージャと関数] ノードで、GetStudentGrades および GetDepartmentName ストアド プロシージャを選択します。Visual Studio 2012 以降では、EF Designer でストアド プロシージャの一括インポートがサポートされています。 [選択したストアド プロシージャと関数をエンティティ モデルにインポート] は既定でオンになっています。
[完了] をクリックします。
既定では、複数の列を返すインポートされた各ストアド プロシージャまたは関数の結果の形状は、自動的に新しい複合型になります。 この例では、GetStudentGrades 関数の結果を StudentGrade エンティティにマップし、GetDepartmentName の結果を none (none が既定値) にマップします。
関数インポートでエンティティ型を返すには、対応するストアド プロシージャから返される列が、返されるエンティティ型のスカラー プロパティと完全に一致する必要があります。 関数インポートでは、単純型または複合型のコレクションを返すことも、値を返さないようにすることもできます。
- デザイン サーフェイスを右クリックし、[モデル ブラウザー] を選択します。
- [モデル ブラウザー] で、[関数インポート] を選択し、GetStudentGrades 関数をダブルクリックします。
- [関数インポートの編集] ダイアログ ボックスで、[エンティティ] を選択し、[StudentGrade] を選択します。
[関数インポート] ダイアログの上部にある [関数インポートをコンポーザブルにする] チェック ボックスを使用すると、コンポーザブルな関数にマップできます。 このボックスをオンにすると、[ストアド プロシージャ/関数名] ドロップダウン リストに、コンポーザブルな関数 (テーブル値関数) だけが表示されます。 このボックスをオフにすると、コンポーザブルでない関数だけが一覧に表示されます。
モデルを使用する
Main メソッドが定義されている Program.cs ファイルを開きます。 Main 関数に次のコードを追加します。
このコードでは、2 つのストアド プロシージャを呼び出します。GetStudentGrades は、指定された StudentId の StudentGrades を返し、GetDepartmentName は、出力パラメーターで部門の名前を返します。
using (SchoolEntities context = new SchoolEntities())
{
// Specify the Student ID.
int studentId = 2;
// Call GetStudentGrades and iterate through the returned collection.
foreach (StudentGrade grade in context.GetStudentGrades(studentId))
{
Console.WriteLine("StudentID: {0}\tSubject={1}", studentId, grade.Subject);
Console.WriteLine("Student grade: " + grade.Grade);
}
// Call GetDepartmentName.
// Declare the name variable that will contain the value returned by the output parameter.
ObjectParameter name = new ObjectParameter("Name", typeof(String));
context.GetDepartmentName(1, name);
Console.WriteLine("The department name is {0}", name.Value);
}
アプリケーションをコンパイルして実行します。 このプログラムの出力は、次のようになります。
StudentID: 2
Student grade: 4.00
StudentID: 2
Student grade: 3.50
The department name is Engineering
出力パラメーター
出力パラメーターが使用されている場合、結果が完全に読み取られるまで値は使用できません。 これは、DbDataReader の基になる動作に起因します。詳細については、DataReader を使用したデータの取得に関する記事を参照してください。
.NET