Entity-framework-stored-procedures

提供:Dev Guides
移動先:案内検索

Entity Framework-ストアドプロシージャ

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

  • ストアドプロシージャを使用してデータベーステーブルで事前定義されたロジックを実行できます。多くの組織では、これらのストアドプロシージャの使用を必要とするポリシーが用意されています。
  • また、EFがエンティティの挿入、更新、削除にストアドプロシージャを使用するように指定することもできます。
  • 動的に構築されたコマンドは、安全で効率的であり、一般に自分で作成するコマンドと同等かそれ以上ですが、ストアドプロシージャが既に存在し、会社の慣行によりテーブルの直接使用が制限される場合が多くあります。
  • または、ストアで実行されるものを明示的に制御し、ストアドプロシージャを作成することを希望する場合があります。

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

新しいプロジェクトの手順

  • ステップ1 *-中央のペインからコンソールアプリケーションを選択し、名前フィールドにStoredProceduresDemoと入力します。
  • ステップ2 *-サーバーエクスプローラーで、データベースを右クリックします。
  • ステップ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
  • ステップ4 *-エディターを右クリックして、[実行]を選択します。

編集者

  • ステップ5 *-データベースを右クリックして、更新をクリックします。 データベースに新しく追加されたテーブルが表示されます。
  • ステップ6 *-サーバーエクスプローラーで、データベースをもう一度右クリックします。

サーバーデータベース

  • ステップ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
  • ステップ8 *-エディターを右クリックして、[実行]を選択します。

実行

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

作成されたストアプロシージャ

  • ステップ10 *-ソリューションエクスプローラーでプロジェクト名を右クリックし、[追加]→[新しいアイテム]を選択します。
  • ステップ11 *-次に、[テンプレート]ペインで[ADO.NETエンティティデータモデル]を選択します。

テンプレートペイン

  • ステップ12 *-名前としてSPModelを入力し、[追加]をクリックします。
  • ステップ13 *-[モデルコンテンツの選択]ダイアログボックスで、データベースからEFデザイナーを選択し、[次へ]をクリックします。

モデルの内容

  • ステップ14 *-データベースを選択して、[次へ]をクリックします。

データベース1

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

データベースオブジェクト

  • ステップ16 *-[ストアドプロシージャと関数]ノードの下にあるGetStudentGradesForCourse関数を選択し、[完了]をクリックします。
  • ステップ17 *-[表示]→[他のウィンドウ]→[エンティティデータモデルブラウザー]を選択し、[関数のインポート]で[GetStudentGrades]を右クリックして[編集]を選択します。

エンティティブラウザ

次のダイアログが生成されます。

エンティティブラウザダイアログ

  • ステップ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

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