デザイナーのクエリ ストアド プロシージャ

このステップバイステップのチュートリアルでは、Entity Framework Designer (EF Designer) を使用してストアド プロシージャをモデルにインポートし、インポートされたストアド プロシージャを呼び出して結果を取得する方法について説明します。

Code First では、ストアド プロシージャまたは関数へのマッピングはサポートされていません。 ただし、ストアド プロシージャまたは関数は、System.Data.Entity.DbSet.SqlQuery メソッドを使用して呼び出すことができます。 次に例を示します。

var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]")`;

前提条件

このチュートリアルを完了するための要件を次に示します。

プロジェクトをセットアップする

  • Visual Studio 2012 を開きます。
  • [ファイル] -> [新規作成] -> [プロジェクト] の順に選択します。
  • 左ペインで [Visual C#] をクリックし、[コンソール] テンプレートを選択します。
  • 名前として「EFwithSProcsSample」と入力します。
  • [OK] を選択します。

Create a Model (モデルの作成)

  • ソリューション エクスプローラーでプロジェクトを右クリックし、[追加] -> [新しい項目] の順に選択します。

  • 左側のメニューから [データ] を選択し、[テンプレート] ペインの [ADO.NET Entity Data Model] を選択します。

  • ファイル名として「EFwithSProcsModel.edmx」と入力し、[追加] をクリックします。

  • [モデルのコンテンツの選択] ダイアログ ボックスで、[データベースから生成] を選択し、[次へ] をクリックします。

  • [新しい接続] をクリックします。
    [接続のプロパティ] ダイアログ ボックスで、サーバー名 (例: (localdb)\mssqllocaldb) を入力し、認証方法を選択します。データベース名として「School」と入力し、[OK] をクリックします。
    指定したデータベース接続設定に従って、[データ接続の選択] ダイアログ ボックスが更新されます。

  • [データベース オブジェクトの選択] ダイアログ ボックスで、[テーブル] チェック ボックスをオンにしてすべてのテーブルを選択します。
    また、[ストアド プロシージャと関数] ノードで、GetStudentGrades および GetDepartmentName ストアド プロシージャを選択します。

    Import Stored Procedures

    Visual Studio 2012 以降では、EF Designer でストアド プロシージャの一括インポートがサポートされています。 [選択したストアド プロシージャと関数をエンティティ モデルにインポート] は既定でオンになっています。

  • [完了] をクリックします。

既定では、複数の列を返すインポートされた各ストアド プロシージャまたは関数の結果の形状は、自動的に新しい複合型になります。 この例では、GetStudentGrades 関数の結果を StudentGrade エンティティにマップし、GetDepartmentName の結果を none (none が既定値) にマップします。

関数インポートでエンティティ型を返すには、対応するストアド プロシージャから返される列が、返されるエンティティ型のスカラー プロパティと完全に一致する必要があります。 関数インポートでは、単純型または複合型のコレクションを返すことも、値を返さないようにすることもできます。

  • デザイン サーフェイスを右クリックし、[モデル ブラウザー] を選択します。
  • [モデル ブラウザー] で、[関数インポート] を選択し、GetStudentGrades 関数をダブルクリックします。
  • [関数インポートの編集] ダイアログ ボックスで、[エンティティ] を選択し、[StudentGrade] を選択します。
    [関数インポート] ダイアログの上部にある [関数インポートをコンポーザブルにする] チェック ボックスを使用すると、コンポーザブルな関数にマップできます。 このボックスをオンにすると、[ストアド プロシージャ/関数名] ドロップダウン リストに、コンポーザブルな関数 (テーブル値関数) だけが表示されます。 このボックスをオフにすると、コンポーザブルでない関数だけが一覧に表示されます。

モデルを使用する

Main メソッドが定義されている Program.cs ファイルを開きます。 Main 関数に次のコードを追加します。

このコードでは、2 つのストアド プロシージャを呼び出します。GetStudentGrades は、指定された StudentIdStudentGrades を返し、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 を使用したデータの取得に関する記事を参照してください。