Wprowadzenie z programem Entity Framework 4.0 Database First i ASP.NET 4 Web Forms — część 7
Autor : Tom Dykstra
Przykładowa aplikacja internetowa Contoso University pokazuje, jak tworzyć aplikacje ASP.NET Web Forms przy użyciu platform Entity Framework 4.0 i Visual Studio 2010. Aby uzyskać informacje na temat serii samouczków, zobacz pierwszy samouczek z serii
korzystanie z procedur składowanych
W poprzednim samouczku zaimplementowano wzorzec dziedziczenia tabeli na hierarchię. W tym samouczku pokazano, jak używać procedur składowanych w celu uzyskania większej kontroli nad dostępem do bazy danych.
Program Entity Framework umożliwia określenie, że ma używać procedur składowanych na potrzeby dostępu do bazy danych. Dla dowolnego typu jednostki można określić procedurę składowaną, która ma być używana do tworzenia, aktualizowania lub usuwania jednostek tego typu. Następnie w modelu danych można dodać odwołania do procedur składowanych, których można użyć do wykonywania zadań, takich jak pobieranie zestawów jednostek.
Używanie procedur składowanych jest typowym wymaganiem dostępu do bazy danych. W niektórych przypadkach administrator bazy danych może wymagać, aby cały dostęp do bazy danych przechodził przez procedury składowane ze względów bezpieczeństwa. W innych przypadkach warto utworzyć logikę biznesową w niektórych procesach używanych przez program Entity Framework podczas aktualizowania bazy danych. Na przykład za każdym razem, gdy jednostka zostanie usunięta, możesz skopiować ją do bazy danych archiwum. Lub za każdym razem, gdy wiersz zostanie zaktualizowany, możesz napisać wiersz do tabeli rejestrowania, która rejestruje, kto dokonał zmiany. Tego rodzaju zadania można wykonywać w procedurze składowanej, która jest wywoływana za każdym razem, gdy program Entity Framework usunie jednostkę lub zaktualizuje jednostkę.
Tak jak w poprzednim samouczku, nie utworzysz żadnych nowych stron. Zamiast tego zmienisz sposób uzyskiwania dostępu do bazy danych przez program Entity Framework dla niektórych utworzonych stron.
W tym samouczku utworzysz procedury składowane w bazie danych na potrzeby wstawiania Student
i Instructor
jednostek. Dodasz je do modelu danych i określisz, że program Entity Framework powinien używać ich do dodawania Student
jednostek i Instructor
do bazy danych. Utworzysz również procedurę składowaną, której można użyć do pobierania Course
jednostek.
Tworzenie procedur składowanych w bazie danych
(Jeśli używasz pliku School.mdf z projektu dostępnego do pobrania w ramach tego samouczka, możesz pominąć tę sekcję, ponieważ procedury składowane już istnieją).
W Eksploratorze serwera rozwiń węzeł School.mdf, kliknij prawym przyciskiem myszy pozycję Procedury składowane i wybierz polecenie Dodaj nową procedurę składowaną.
Skopiuj następujące instrukcje SQL i wklej je w oknie procedury składowanej, zastępując szkielet procedury składowanej.
CREATE PROCEDURE [dbo].[InsertStudent]
@LastName nvarchar(50),
@FirstName nvarchar(50),
@EnrollmentDate datetime
AS
INSERT INTO dbo.Person (LastName,
FirstName,
EnrollmentDate)
VALUES (@LastName,
@FirstName,
@EnrollmentDate);
SELECT SCOPE_IDENTITY() as NewPersonID;
Student
jednostki mają cztery właściwości: PersonID
, , FirstName
LastName
i EnrollmentDate
. Baza danych automatycznie generuje wartość identyfikatora, a procedura składowana akceptuje parametry dla pozostałych trzech. Procedura składowana zwraca wartość klucza rekordu nowego wiersza, aby program Entity Framework mógł śledzić to w wersji jednostki przechowywanej w pamięci.
Zapisz i zamknij okno procedury składowanej.
Utwórz procedurę składowaną InsertInstructor
w taki sam sposób, używając następujących instrukcji SQL:
CREATE PROCEDURE [dbo].[InsertInstructor]
@LastName nvarchar(50),
@FirstName nvarchar(50),
@HireDate datetime
AS
INSERT INTO dbo.Person (LastName,
FirstName,
HireDate)
VALUES (@LastName,
@FirstName,
@HireDate);
SELECT SCOPE_IDENTITY() as NewPersonID;
Utwórz Update
również procedury składowane dla Student
jednostek i .Instructor
(Baza danych ma już procedurę składowaną DeletePerson
, która będzie działać zarówno dla jednostek, jak Instructor
i Student
).
CREATE PROCEDURE [dbo].[UpdateStudent]
@PersonID int,
@LastName nvarchar(50),
@FirstName nvarchar(50),
@EnrollmentDate datetime
AS
UPDATE Person SET LastName=@LastName,
FirstName=@FirstName,
EnrollmentDate=@EnrollmentDate
WHERE PersonID=@PersonID;
CREATE PROCEDURE [dbo].[UpdateInstructor]
@PersonID int,
@LastName nvarchar(50),
@FirstName nvarchar(50),
@HireDate datetime
AS
UPDATE Person SET LastName=@LastName,
FirstName=@FirstName,
HireDate=@HireDate
WHERE PersonID=@PersonID;
W tym samouczku zamapujesz wszystkie trzy funkcje — wstawianie, aktualizowanie i usuwanie — dla każdego typu jednostki. Program Entity Framework w wersji 4 umożliwia mapowanie tylko jednej lub dwóch z tych funkcji na procedury składowane bez mapowania innych, z jednym wyjątkiem: jeśli mapujesz funkcję aktualizacji, ale nie funkcję delete, program Entity Framework zgłosi wyjątek podczas próby usunięcia jednostki. W programie Entity Framework w wersji 3.5 nie masz takiej elastyczności podczas mapowania procedur składowanych: jeśli do mapowania wszystkich trzech funkcji była wymagana jedna funkcja.
Aby utworzyć procedurę składowaną, która odczytuje, a nie aktualizuje danych, utwórz tę, która wybiera wszystkie Course
jednostki, używając następujących instrukcji SQL:
CREATE PROCEDURE [dbo].[GetCourses]
AS
SELECT CourseID, Title, Credits, DepartmentID FROM dbo.Course
Dodawanie procedur składowanych do modelu danych
Procedury składowane są teraz zdefiniowane w bazie danych, ale należy je dodać do modelu danych, aby udostępnić je platformie Entity Framework. Otwórz plik SchoolModel.edmx, kliknij prawym przyciskiem myszy powierzchnię projektową i wybierz pozycję Aktualizuj model z bazy danych. Na karcie Dodawanie okna dialogowego Wybieranie obiektów bazy danych rozwiń węzeł Procedury składowane, wybierz nowo utworzone procedury składowane i procedurę DeletePerson
składowaną, a następnie kliknij przycisk Zakończ.
Mapowanie procedur składowanych
W projektancie modelu danych kliknij prawym przyciskiem myszy Student
jednostkę i wybierz pozycję Mapowanie procedury składowanej.
Zostanie wyświetlone okno Szczegóły mapowania , w którym można określić procedury składowane, których program Entity Framework powinien używać do wstawiania, aktualizowania i usuwania jednostek tego typu.
Ustaw funkcję Insert na InsertStudent. W oknie jest wyświetlana lista parametrów procedury składowanej, z których każda musi zostać zamapowana na właściwość jednostki. Dwa z nich są mapowane automatycznie, ponieważ nazwy są takie same. Nie ma właściwości jednostki o nazwie FirstName
, dlatego musisz ręcznie wybrać FirstMidName
z listy rozwijanej, która zawiera dostępne właściwości jednostki. (Dzieje się tak, ponieważ zmieniono nazwę FirstName
właściwości na FirstMidName
w pierwszym samouczku).
W tym samym oknie Szczegóły mapowania zamapuj Update
funkcję na UpdateStudent
procedurę składowaną (upewnij się, że określono FirstMidName
jako wartość parametru dla FirstName
parametru , tak jak Insert
w przypadku procedury składowanej) i Delete
funkcję do DeletePerson
procedury składowanej.
Wykonaj tę samą procedurę, aby zamapować procedury wstawiania, aktualizowania i usuwania procedur składowanych dla instruktorów do Instructor
jednostki.
W przypadku procedur składowanych, które odczytują, a nie aktualizują dane, użyj okna Przeglądarka modelu , aby zamapować procedurę składowaną na zwracany typ jednostki. W projektancie modelu danych kliknij prawym przyciskiem myszy powierzchnię projektową i wybierz pozycję Przeglądarka modeli. Otwórz węzeł SchoolModel.Store , a następnie otwórz węzeł Procedury składowane . Następnie kliknij prawym przyciskiem myszy procedurę GetCourses
składowaną i wybierz polecenie Dodaj import funkcji.
W oknie dialogowym Dodawanie importu funkcji w obszarze Zwraca kolekcję wybierz pozycję Jednostki, a następnie wybierz jako Course
zwrócony typ jednostki. Gdy skończysz, kliknij przycisk OK. Zapisz i zamknij plik edmx .
Używanie procedur składowanych wstawiania, aktualizowania i usuwania
Procedury składowane do wstawiania, aktualizowania i usuwania danych są używane automatycznie przez program Entity Framework po dodaniu ich do modelu danych i zamapowane na odpowiednie jednostki. Teraz możesz uruchomić stronę StudentsAdd.aspx i za każdym razem, gdy tworzysz nowego ucznia, program Entity Framework użyje InsertStudent
procedury składowanej, aby dodać nowy wiersz do Student
tabeli.
Uruchom stronę Students.aspx , a nowy uczeń pojawi się na liście.
Zmień nazwę, aby sprawdzić, czy funkcja update działa, a następnie usuń ucznia, aby sprawdzić, czy funkcja delete działa.
Korzystanie z opcji Wybierz procedury składowane
Program Entity Framework nie uruchamia automatycznie procedur składowanych, takich jak GetCourses
, i nie można ich używać z kontrolką EntityDataSource
. Aby ich używać, należy wywołać je z kodu.
Otwórz plik InstructorsCourses.aspx.cs . Metoda PopulateDropDownLists
używa zapytania LINQ-to-Entities, aby pobrać wszystkie jednostki kursu, aby umożliwić wykonywanie pętli za pośrednictwem listy i określenie, do których z nich jest przypisany instruktor i do których z nich nie przypisano:
var allCourses = (from c in context.Courses
select c).ToList();
Zastąp go następującym kodem:
var allCourses = context.GetCourses();
Strona używa GetCourses
teraz procedury składowanej do pobrania listy wszystkich kursów. Uruchom stronę, aby sprawdzić, czy działa ona tak jak poprzednio.
(Właściwości nawigacji jednostek pobranych przez procedurę składowaną mogą nie być automatycznie wypełniane danymi powiązanymi z tymi jednostkami, w zależności od ObjectContext
ustawień domyślnych. Aby uzyskać więcej informacji, zobacz Ładowanie powiązanych obiektów w bibliotece MSDN).
W następnym samouczku dowiesz się, jak używać funkcji danych dynamicznych, aby ułatwić programowanie i testowanie reguł formatowania i walidacji danych. Zamiast określać reguły poszczególnych stron sieci Web, takie jak ciągi formatu danych i czy pole jest wymagane, można określić takie reguły w metadanych modelu danych i są one automatycznie stosowane na każdej stronie.