Začínáme s Entity Framework 4.0 Database First a ASP.NET 4 Web Forms – část 7
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.
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;
Student
Entity mají čtyři vlastnosti: PersonID
, LastName
, FirstName
a 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 Instructor
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;
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.
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.
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.
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 FirstName
FirstMidName
.)
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
.
Stejným postupem namapujte uložené procedury vložení, aktualizace a odstranění pro instruktory na entitu Instructor
.
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.
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 .
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.
Spusťte stránku Students.aspx a nový student se zobrazí v seznamu.
Změňte název, abyste ověřili, že funkce update funguje, a pak odstraňte studenta, abyste ověřili, že funkce delete funguje.
Použití funkce Vybrat uložené procedury
Entity Framework automaticky nespouští uložené procedury, jako GetCourses
je , 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.