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.