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

このステップバイステップチュートリアルでは、Entity Framework Designer (EF デザイナー) を使用してストアドプロシージャをモデルにインポートし、インポートされたストアドプロシージャを呼び出して結果を取得する方法について説明します。This step-by-step walkthrough show how to use the Entity Framework Designer (EF Designer) to import stored procedures into a model and then call the imported stored procedures to retrieve results. 

この Code First では、ストアドプロシージャまたは関数へのマッピングはサポートされていません。Note, that Code First does not support mapping to stored procedures or functions. ただし、ストアドプロシージャまたは関数は、ストアドプロシージャまたは関数を呼び出すことによって呼び出すことができます。However, you can call stored procedures or functions by using the System.Data.Entity.DbSet.SqlQuery method. 次に例を示します。For example:

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

前提条件Prerequisites

このチュートリアルを完了するための要件を次に示します。To complete this walkthrough, you will need:

プロジェクトを設定するSet up the Project

  • Visual Studio 2012 を開きます。Open Visual Studio 2012.
  • ファイルの選択- > 新規作成- > プロジェクトSelect File-> New -> Project
  • 左側のウィンドウで、[ **Visual C # **] をクリックし、コンソールテンプレートを選択します。In the left pane, click Visual C#, and then select the Console template.
  • 名前として「 Efwithsprocssample」と入力し   ます。Enter EFwithSProcsSample as the name.
  •  [OK] を選択します。Select OK.

モデルの作成Create a Model

  • ソリューションエクスプローラーでプロジェクトを右クリックし、[追加]、[ ** > 新しい項目**] の順に選択します。Right-click the project in Solution Explorer and select Add -> New Item.

  • 左側のメニューから [ データ ] を選択し、[テンプレート] ペインで [ ADO.NET Entity Data Model ] を選択します。Select Data from the left menu and then select ADO.NET Entity Data Model in the Templates pane.

  • ファイル名として「 Efwithsprocsmodel. .edmx 」と入力し、[ 追加] をクリックします。Enter EFwithSProcsModel.edmx for the file name, and then click Add.

  • [モデルのコンテンツの選択] ダイアログボックスで、[ データベースから生成] を選択し、[ 次へ] をクリックします。In the Choose Model Contents dialog box, select Generate from database, and then click Next.

  • 新しい接続] をクリックします。Click New Connection.
    [接続プロパティ] ダイアログボックスで、サーバー名 (たとえば、 (localdb) \ mssqllocaldb) を入力し、認証方法を選択します。データベース名として「 School」と入力し、[    OK] をクリックします。In the Connection Properties dialog box, enter the server name (for example, (localdb)\mssqllocaldb), select the authentication method, type School for the database name, and then click OK.
    [データ接続の選択] ダイアログボックスが、データベース接続の設定によって更新されます。The Choose Your Data Connection dialog box is updated with your database connection setting.

  • [データベースオブジェクトの選択] ダイアログボックスで、[テーブル] チェックボックスをオンにして   、すべてのテーブルを選択します。In the Choose Your Database Objects dialog box, check the Tables checkbox to select all the tables.
    また、[ ストアドプロシージャと関数 ] ノードで、 GetStudentGrades および GetDepartmentNameの下にある次のストアドプロシージャを選択します。Also, select the following stored procedures under the Stored Procedures and Functions node: GetStudentGrades and GetDepartmentName. 

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

    Visual Studio 2012 以降では、EF デザイナーはストアドプロシージャの一括インポートをサポートしています。既定では、[ 選択したストアドプロシージャと関数をエンティティモデルにインポート する] がオンになっています。Starting with Visual Studio 2012 the EF Designer supports bulk import of stored procedures. The Import selected stored procedures and functions into theentity model is checked by default.

  • 完了] をクリックします。Click Finish.

既定では、インポートされた各ストアドプロシージャまたは複数の列を返す関数の結果構造は、自動的に新しい複合型になります。By default, the result shape of each imported stored procedure or function that returns more than one column will automatically become a new complex type. この例では、 GetStudentGrades 関数の結果を StudentGrade エンティティにマップし、 GetDepartmentName の結果を none (既定値はnone ) にマップします。In this example we want to map the results of the GetStudentGrades function to the StudentGrade entity and the results of the GetDepartmentName to none (none is the default value).

関数インポートでエンティティ型を返すには、対応するストアドプロシージャによって返される列が、返されたエンティティ型のスカラープロパティと正確に一致している必要があります。For a function import to return an entity type, the columns returned by the corresponding stored procedure must exactly match the scalar properties of the returned entity type. 関数インポートは、単純型のコレクション、複合型、または値を返さないこともできます。A function import can also return collections of simple types, complex types, or no value.

  • デザイン画面を右クリックし、[ モデルブラウザー] を選択します。Right-click the design surface and select Model Browser.
  • モデルブラウザーで、[ 関数インポート] を選択し、 GetStudentGrades関数をダブルクリックします。In Model Browser, select Function Imports, and then double-click the GetStudentGrades function.
  • [関数インポートの編集] ダイアログボックスで、[ エンティティ] を選択し、[StudentGrade] を   選択します。 StudentGradeIn the Edit Function Import dialog box, select Entities and choose StudentGrade.
    [関数インポート] ダイアログボックスの上部にある [関数インポートはコンポーザブル] チェックボックスをオンにすると、コンポーザブルな関数にマップできます。このチェックボックスをオンにすると、[ストアドプロシージャ/関数名] ボックスの一覧に、コンポーザブルな関数 (テーブル値関数) のみが表示されます。このチェックボックスをオンにしない場合、一覧には、コンポーザブルではない関数のみが表示されます。The Function Import is composable checkbox at the top of the Function Imports dialog will let you map to composable functions. If you do check this box, only composable functions (Table-valued Functions) will appear in the Stored Procedure / Function Name drop-down list. If you do not check this box, only non-composable functions will be shown in the list.

モデルを使用するUse the Model

Mainメソッドが定義されているProgram.csファイルを開きます。Open the Program.cs file where the Main method is defined. Main 関数に次のコードを追加します。Add the following code into the Main function.

このコードは2つのストアドプロシージャを呼び出します。 GetStudentGrades (指定されたStudentIdStudentGradesを返します) とGetDepartmentName (出力パラメーターで department の名前を返します) を呼び出します。The code calls two stored procedures: GetStudentGrades (returns StudentGrades for the specified StudentId) and GetDepartmentName (returns the name of the department in the output parameter).  

    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);

    }

アプリケーションをコンパイルして実行します。Compile and run the application. このプログラムの出力は、次のようになります。The program produces the following output:

StudentID: 2
Student grade: 4.00
StudentID: 2
Student grade: 3.50
The department name is Engineering

出力パラメーターOutput Parameters

出力パラメーターが使用されている場合、結果が完全に読み取られるまで、値は使用できません。If output parameters are used, their values will not be available until the results have been read completely. これは、DbDataReader の基になる動作に起因します。詳細については、「 DataReader を使用したデータの取得 」を参照してください。This is due to the underlying behavior of DbDataReader, see Retrieving Data Using a DataReader for more details.