Entity Framework - procedury składowane

Entity Framework umożliwia używanie procedur składowanych w Entity Data Model zamiast lub w połączeniu z jego automatycznym generowaniem poleceń.

  • Za pomocą procedur składowanych można wykonywać wstępnie zdefiniowaną logikę w tabelach bazy danych, a wiele organizacji ma zasady, które wymagają użycia tych procedur składowanych.

  • Może również określić, że EF powinien używać procedur składowanych do wstawiania, aktualizowania lub usuwania jednostek.

  • Chociaż dynamicznie budowane polecenia są bezpieczne, wydajne i generalnie równie dobre lub lepsze od tych, które można napisać samodzielnie, istnieje wiele przypadków, w których procedury składowane już istnieją, a praktyki firmy mogą ograniczać bezpośrednie korzystanie z tabel.

  • Alternatywnie możesz po prostu chcieć mieć jawną kontrolę nad tym, co jest wykonywane w sklepie i wolisz tworzyć procedury składowane.

Poniższy przykład tworzy nowy projekt z Plik → Nowy → Projekt.

Step 1 - Wybierz aplikację konsoli ze środkowego panelu i wprowadź StoredProceduresDemo w polu nazwy.

Step 2 - W eksploratorze serwerów kliknij prawym przyciskiem myszy bazę danych.

Step 3 - Wybierz Nowe zapytanie i wprowadź następujący kod w edytorze T-SQL, aby dodać nową tabelę do bazy danych.

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 - Kliknij prawym przyciskiem myszy edytor i wybierz opcję Wykonaj.

Step 5- Kliknij prawym przyciskiem myszy swoją bazę danych i kliknij Odśwież. Zobaczysz nowo dodaną tabelę w swojej bazie danych.

Step 6 - W eksploratorze serwerów kliknij ponownie prawym przyciskiem myszy bazę danych.

Step 7 - Wybierz Nowe zapytanie i wprowadź następujący kod w edytorze T-SQL, aby dodać procedurę składowaną do bazy danych, która zwróci oceny ucznia.

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 - Kliknij prawym przyciskiem myszy edytor i wybierz opcję Wykonaj.

Step 9- Kliknij prawym przyciskiem myszy swoją bazę danych i kliknij Odśwież. Zobaczysz, że w bazie danych została utworzona procedura składowana.

Step 10 - Kliknij prawym przyciskiem myszy nazwę projektu w Eksploratorze rozwiązań i wybierz Dodaj → Nowy element.

Step 11 - Następnie wybierz ADO.NET Entity Data Model w okienku Szablony.

Step 12 - Wpisz SPModel jako nazwę, a następnie kliknij przycisk Dodaj.

Step 13 - W oknie dialogowym Wybierz zawartość modelu wybierz projektanta EF z bazy danych, a następnie kliknij przycisk Dalej.

Step 14 - Wybierz bazę danych i kliknij Dalej.

Step 15 - W oknie dialogowym Wybierz obiekty bazy danych kliknij tabele, widoki.

Step 16 - Wybierz funkcję GetStudentGradesForCourse znajdującą się w węźle Stored Procedures and Functions i kliknij Finish.

Step 17 - Wybierz View → Other Windows → Entity Data Model Browser i kliknij prawym przyciskiem myszy GetStudentGrades w sekcji Import funkcji i wybierz Edytuj.

Spowoduje to wyświetlenie następującego okna dialogowego.

Step 18 - Kliknij przycisk radiowy Encje i wybierz StudentGrade z pola wyboru jako typ zwrotu tej procedury składowanej i kliknij OK.

Przyjrzyjmy się poniższemu kodowi C #, w którym wszystkie oceny zostaną pobrane przez przekazanie identyfikatora ucznia jako parametru w procedurze składowanej GetStudentGrades.

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

      }
   }
}

Kiedy powyższy kod zostanie skompilowany i wykonany, otrzymasz następujący wynik -

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

Zalecamy wykonanie powyższego przykładu krok po kroku w celu lepszego zrozumienia.