Udostępnij za pośrednictwem


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ą.

obraz15

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;

image14

Studentjednostki mają cztery właściwości: PersonID, , FirstNameLastNamei 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.

obraz20

Mapowanie procedur składowanych

W projektancie modelu danych kliknij prawym przyciskiem myszy Student jednostkę i wybierz pozycję Mapowanie procedury składowanej.

image21

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.

obraz22

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).

obraz23

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 FirstNameparametru , tak jak Insert w przypadku procedury składowanej) i Delete funkcję do DeletePerson procedury składowanej.

image01

Wykonaj tę samą procedurę, aby zamapować procedury wstawiania, aktualizowania i usuwania procedur składowanych dla instruktorów do Instructor jednostki.

image02

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.

image24

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 .

obraz25

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.

image03

Uruchom stronę Students.aspx , a nowy uczeń pojawi się na liście.

image04

Zmień nazwę, aby sprawdzić, czy funkcja update działa, a następnie usuń ucznia, aby sprawdzić, czy funkcja delete działa.

image05

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.