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

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

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

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

前提条件

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

プロジェクトを設定する

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

モデルの作成

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

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

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

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

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

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

    ストアドプロシージャのインポート

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

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

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

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

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

モデルを使用する

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

このコードは 、GetStudentGrades (指定された StudentId に対して StudentGrades を返します) と GetDepartmentName (出力パラメーターで部門の名前を返します) という 2 つのストアド プロシージャを呼び出します。

    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 を使用したデータの取得」を参照してください。