Sdílet prostřednictvím


Začínáme s Entity Framework 4.0 Database First a ASP.NET 4 Web Forms – část 7

Tom Dykstra

Ukázková webová aplikace Contoso University ukazuje, jak vytvářet ASP.NET Web Forms aplikace pomocí entity Framework 4.0 a sady Visual Studio 2010. Informace o této sérii kurzů najdete v prvním kurzu v této řadě.

Použití uložených procedur

V předchozím kurzu jste implementovali vzor dědičnosti tabulky na hierarchii. V tomto kurzu se dozvíte, jak pomocí uložených procedur získat větší kontrolu nad přístupem k databázi.

Entity Framework umožňuje určit, že má používat uložené procedury pro přístup k databázi. Pro libovolný typ entity můžete zadat uloženou proceduru, která se má použít k vytváření, aktualizaci nebo odstraňování entit tohoto typu. V datovém modelu pak můžete přidat odkazy na uložené procedury, které můžete použít k provádění úloh, jako je načítání sad entit.

Použití uložených procedur je běžným požadavkem pro přístup k databázi. V některých případech může správce databáze z bezpečnostních důvodů vyžadovat, aby veškerý přístup k databázi procházel uloženými procedurami. V jiných případech můžete chtít obchodní logiku začlenit do některých procesů, které Entity Framework používá při aktualizaci databáze. Například při každém odstranění entity můžete chtít zkopírovat ji do archivační databáze. Nebo při každé aktualizaci řádku můžete chtít zapsat řádek do tabulky protokolování, který zaznamenává, kdo změnu provedl. Tyto druhy úkolů můžete provádět v uložené proceduře, která se nazývá vždy, když Entity Framework entitu odstraní nebo aktualizuje entitu.

Stejně jako v předchozím kurzu nebudete vytvářet žádné nové stránky. Místo toho změníte způsob, jakým Entity Framework přistupuje k databázi pro některé stránky, které jste už vytvořili.

V tomto kurzu vytvoříte v databázi uložené procedury pro vkládání Student entit a Instructor . Přidáte je do datového modelu a určíte, že entity Framework by je měly používat k přidávání Student entit a Instructor do databáze. Vytvoříte také uloženou proceduru, kterou můžete použít k načtení Course entit.

Vytváření uložených procedur v databázi

(Pokud používáte soubor School.mdf z projektu, který je k dispozici ke stažení v tomto kurzu, můžete tuto část přeskočit, protože uložené procedury už existují.)

V Průzkumníku serveru rozbalte school.mdf, klikněte pravým tlačítkem na Uložené procedury a vyberte Přidat novou uloženou proceduru.

image15

Zkopírujte následující příkazy SQL a vložte je do okna uložené procedury a nahraďte tak uloženou proceduru kostry.

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

Student Entity mají čtyři vlastnosti: PersonID, LastName, FirstNamea EnrollmentDate. Databáze automaticky vygeneruje hodnotu ID a uložená procedura přijímá parametry pro ostatní tři. Uložená procedura vrátí hodnotu klíče záznamu nového řádku, takže Entity Framework o ní může sledovat verzi entity, kterou uchovává v paměti.

Uložte a zavřete okno uložené procedury.

Stejným způsobem vytvořte uloženou InsertInstructor proceduru pomocí následujících příkazů 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;

Vytvořte Update také uložené procedury pro Student entity a Instructor . (Databáze už má uloženou proceduru DeletePerson , která bude fungovat pro entity i InstructorStudent .)

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;

V tomto kurzu namapujete všechny tři funkce – vložení, aktualizaci a odstranění – pro každý typ entity. Entity Framework verze 4 umožňuje mapovat pouze jednu nebo dvě z těchto funkcí na uložené procedury bez mapování ostatních, s jednou výjimkou: pokud namapujete funkci update, ale ne funkci delete, Entity Framework vyvolá výjimku při pokusu o odstranění entity. V Entity Frameworku verze 3.5 jste neměli takovou flexibilitu při mapování uložených procedur: pokud jste namapovali jednu funkci, museli jste namapovat všechny tři.

Pokud chcete vytvořit uloženou proceduru, která místo aktualizace dat čte, vytvořte proceduru, která vybere všechny Course entity pomocí následujících příkazů SQL:

CREATE PROCEDURE [dbo].[GetCourses]
            AS
            SELECT CourseID, Title, Credits, DepartmentID FROM dbo.Course

Přidání uložených procedur do datového modelu

Uložené procedury jsou teď definované v databázi, ale musí se přidat do datového modelu, aby byly dostupné pro Entity Framework. Otevřete Soubor SchoolModel.edmx, klikněte pravým tlačítkem na návrhovou plochu a vyberte Aktualizovat model z databáze. Na kartě Přidat v dialogovém okně Zvolit databázové objekty rozbalte uložené procedury, vyberte nově vytvořené uložené procedury a uloženou proceduru DeletePerson a potom klikněte na Dokončit.

image20

Mapování uložených procedur

V návrháři datového modelu klikněte pravým tlačítkem na entitu Student a vyberte Mapování uložené procedury.

obrázek 21

Zobrazí se okno Podrobnosti mapování , ve kterém můžete zadat uložené procedury, které by entity Framework měly používat pro vkládání, aktualizaci a odstraňování entit tohoto typu.

image22

Nastavte funkci Insert na InsertStudent. V okně se zobrazí seznam parametrů uložené procedury, z nichž každý musí být namapován na vlastnost entity. Dvě z nich se mapují automaticky, protože názvy jsou stejné. Neexistuje žádná vlastnost entity s názvem FirstName, takže musíte ručně vybrat FirstMidName z rozevíracího seznamu, který zobrazuje dostupné vlastnosti entity. (Důvodem je to, že jste v prvním kurzu změnili název vlastnosti na FirstNameFirstMidName .)

image23

Ve stejném okně Podrobnosti mapování namapujte Update funkci na uloženou proceduru UpdateStudent (nezapomeňte zadat FirstMidName hodnotu parametru pro FirstName, stejně jako u Insert uložené procedury) a Delete funkci na uloženou proceduru DeletePerson .

obrázek 01

Stejným postupem namapujte uložené procedury vložení, aktualizace a odstranění pro instruktory na entitu Instructor .

obrázek 02

U uložených procedur, které data čtou, ale ne aktualizují, můžete pomocí okna Prohlížeče modelů namapovat uloženou proceduru na typ entity, který vrací. V návrháři datového modelu klikněte pravým tlačítkem na návrhovou plochu a vyberte Prohlížeč modelů. Otevřete uzel SchoolModel.Store a pak otevřete uzel Uložené procedury . Pak klikněte pravým tlačítkem na uloženou proceduru GetCourses a vyberte Přidat import funkce.

obrázek 24

V dialogovém okně Přidat import funkce v části Vrací kolekcivyberte Entity a pak jako vrácený typ entity vyberte Course . Až to budete mít, klikněte na OK. Uložte a zavřete soubor .edmx .

obrázek 25

Použití funkce Vložení, aktualizace a odstranění uložených procedur

Uložené procedury pro vložení, aktualizaci a odstranění dat se v Entity Frameworku používají automaticky po jejich přidání do datového modelu a jejich namapování na příslušné entity. Teď můžete spustit stránku StudentsAdd.aspx a pokaždé, když vytvoříte nového studenta, Entity Framework použije uloženou InsertStudent proceduru k přidání nového řádku do Student tabulky.

obrázek 03

Spusťte stránku Students.aspx a nový student se zobrazí v seznamu.

obrázek 04

Změňte název, abyste ověřili, že funkce update funguje, a pak odstraňte studenta, abyste ověřili, že funkce delete funguje.

obrázek 05

Použití funkce Vybrat uložené procedury

Entity Framework automaticky nespouští uložené procedury, jako GetCoursesje , a nemůžete je použít s ovládacím EntityDataSource prvku. Pokud je chcete použít, zavolejte je z kódu.

Otevřete soubor InstructorsCourses.aspx.cs . Metoda PopulateDropDownLists pomocí dotazu LINQ-to-Entities načte všechny entity kurzu, aby bylo možné projít seznam a určit, ke kterým entitám je přiřazený instruktor a které nejsou přiřazené:

var allCourses = (from c in context.Courses
                  select c).ToList();

Nahraďte ho následujícím kódem:

var allCourses = context.GetCourses();

Stránka teď používá uloženou proceduru GetCourses k načtení seznamu všech kurzů. Spusťte stránku a ověřte, že funguje stejně jako předtím.

(V závislosti na ObjectContext výchozím nastavení nemusí být navigační vlastnosti entit načtených uloženou procedurou automaticky naplněny daty souvisejícími s těmito entitami. Další informace najdete v tématu Načítání souvisejících objektů v knihovně MSDN.)

V dalším kurzu se dozvíte, jak pomocí funkce Dynamických dat usnadnit programování a testování pravidel formátování a ověřování dat. Místo toho, abyste na každé webové stránce zadávali pravidla, jako jsou řetězce formátu dat a jestli je pole povinné, můžete tato pravidla zadat v metadatech datového modelu a automaticky se použijí na každé stránce.