エンティティフレームワーク-ストアドプロシージャ

Entity Frameworkを使用すると、自動コマンド生成の代わりに、またはそれと組み合わせて、Entity DataModelでストアドプロシージャを使用できます。

  • ストアドプロシージャを使用して、データベーステーブルに対して事前定義されたロジックを実行できます。多くの組織では、これらのストアドプロシージャの使用を要求するポリシーが設定されています。

  • また、EFがエンティティの挿入、更新、または削除にストアドプロシージャを使用するように指定することもできます。

  • 動的に構築されたコマンドは安全で効率的であり、一般に自分で作成したコマンドと同等かそれ以上ですが、ストアドプロシージャがすでに存在し、会社の慣行によりテーブルの直接使用が制限されている場合が多くあります。

  • または、ストアで実行される内容を明示的に制御し、ストアドプロシージャを作成することもできます。

次の例では、[ファイル]→[新規]→[プロジェクト]から新しいプロジェクトを作成します。

Step 1 −中央のペインからコンソールアプリケーションを選択し、名前フィールドにStoredProceduresDemoと入力します。

Step 2 −サーバーエクスプローラーでデータベースを右クリックします。

Step 3 − [新しいクエリ]を選択し、T-SQLエディターに次のコードを入力して、データベースに新しいテーブルを追加します。

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = 
   OBJECT_ID(N'[dbo].[StudentGrade]') AND type in (N'U'))

BEGIN

   CREATE TABLE [dbo].[StudentGrade](

      [EnrollmentID] [int] IDENTITY(1,1) NOT NULL,
      [CourseID] [int] NOT NULL,
      [StudentID] [int] NOT NULL,
      [Grade] [decimal](3, 2) NULL,

      CONSTRAINT [PK_StudentGrade] PRIMARY KEY CLUSTERED (
         [EnrollmentID] ASC
      )

      WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

   ) ON [PRIMARY]

END
GO

Step 4 −エディターを右クリックして、「実行」を選択します。

Step 5−データベースを右クリックし、[更新]をクリックします。データベースに新しく追加されたテーブルが表示されます。

Step 6 −サーバーエクスプローラーで、データベースをもう一度右クリックします。

Step 7 − [新しいクエリ]を選択し、T-SQLエディターに次のコードを入力して、データベースにストアドプロシージャを追加します。これにより、学生の成績が返されます。

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = 
   OBJECT_ID(N'[dbo].[GetStudentGrades]') AND type in (N'P', N'PC'))

BEGIN

   EXEC dbo.sp_executesql @statement = N'
   CREATE PROCEDURE [dbo].[GetStudentGrades]
   @StudentID int
   AS
   SELECT EnrollmentID, Grade, CourseID, StudentID FROM dbo.StudentGrade 
   WHERE StudentID = @StudentID
   '
END
GO

Step 8 −エディターを右クリックして、「実行」を選択します。

Step 9−データベースを右クリックし、[更新]をクリックします。データベースにストアドプロシージャが作成されていることがわかります。

Step 10 −ソリューションエクスプローラーでプロジェクト名を右クリックし、「追加」→「新規アイテム」を選択します。

Step 11 −次に、[テンプレート]ペインで[ADO.NETエンティティデータモデル]を選択します。

Step 12 −名前としてSPModelを入力し、[追加]をクリックします。

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

Step 14 −データベースを選択し、[次へ]をクリックします。

Step 15 − [データベースオブジェクトの選択]ダイアログボックスで、テーブル、ビューをクリックします。

Step 16 − [ストアドプロシージャと関数]ノードの下にあるGetStudentGradesForCourse関数を選択し、[完了]をクリックします。

Step 17 −「表示」→「その他のウィンドウ」→「エンティティデータモデルブラウザ」を選択し、「関数のインポート」の下の「GetStudentGrades」を右クリックして「編集」を選択します。

次のダイアログが表示されます。

Step 18 − [エンティティ]ラジオボタンをクリックし、このストアドプロシージャの戻り値の型としてコンボボックスから[StudentGrade]を選択し、[OK]をクリックします。

GetStudentGradesストアドプロシージャのパラメータとして学生IDを渡すことにより、すべての成績が取得される次のC#コードを見てみましょう。

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         int studentID = 22;
         var studentGrades = context.GetStudentGrades(studentID);

         foreach (var student in studentGrades) {
            Console.WriteLine("Course ID: {0}, Title: {1}, Grade: {2} ", 
               student.CourseID, student.Course.Title, student.Grade);
         }

         Console.ReadKey();

      }
   }
}

上記のコードをコンパイルして実行すると、次の出力が返されます。

Course ID: 4022, Title: Microeconomics, Grade: 3.00
Course ID: 4041, Title: Macroeconomics, Grade: 3.50

理解を深めるために、上記の例を段階的に実行することをお勧めします。