Začínáme s Entity Framework 4.0 Database First a ASP.NET 4 Web Forms – část 2
Ukázková webová aplikace Contoso University ukazuje, jak vytvářet ASP.NET Web Forms aplikace pomocí entity frameworku 4.0 a sady Visual Studio 2010. Informace o sérii kurzů najdete v prvním kurzu v této řadě.
Ovládací prvek EntityDataSource
V předchozím kurzu jste vytvořili web, databázi a datový model. V tomto kurzu pracujete s ovládacím EntityDataSource
prvku, který ASP.NET poskytuje, abyste usnadnili práci s datovým modelem Entity Framework. Vytvoříte GridView
ovládací prvek pro zobrazení a úpravu dat studentů, DetailsView
ovládací prvek pro přidávání nových studentů a DropDownList
ovládací prvek pro výběr oddělení (který později použijete pro zobrazení přidružených kurzů).
Všimněte si, že v této aplikaci nebudete přidávat ověřování vstupu na stránky, které aktualizují databázi, a některé zpracování chyb nebude tak robustní, jak by bylo vyžadováno v produkční aplikaci. Tím se kurz soustředí na Entity Framework a zabrání tomu, aby se příliš prodloužil. Podrobnosti o tom, jak přidat tyto funkce do aplikace, najdete v tématech Ověřování vstupu uživatele na webových stránkách ASP.NET a Zpracování chyb v ASP.NET Pages and Applications.
Přidání a konfigurace ovládacího prvku EntityDataSource
Začnete konfigurací ovládacího prvku EntityDataSource
pro čtení Person
entit ze People
sady entit.
Ujistěte se, že máte otevřenou sadu Visual Studio a že pracujete s projektem, který jste vytvořili v části 1. Pokud jste projekt nevytvořili od vytvoření datového modelu nebo od poslední změny, kterou jste v něm udělali, sestavte projekt teď. Změny datového modelu nebudou návrháři k dispozici, dokud se projekt nestaví.
Vytvořte novou webovou stránku pomocí webového formuláře pomocí šablony stránky předlohy a pojmenujte ji Students.aspx.
Jako stránku předlohy zadejte Site.Master . Všechny stránky, které vytvoříte pro tyto kurzy, budou tuto stránku předlohy používat.
V zobrazení Zdroj přidejte h2
do Content
ovládacího prvku nadpis s názvem Content2
, jak je znázorněno v následujícím příkladu:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Student List</h2>
</asp:Content>
Na kartě Data v sadě nástrojů přetáhněte EntityDataSource
ovládací prvek na stránku, umístěte ho pod záhlaví a změňte ID na StudentsEntityDataSource
:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Student List</h2>
<asp:EntityDataSource ID="StudentsEntityDataSource" runat="server">
</asp:EntityDataSource>
</asp:Content>
Přepněte do návrhového zobrazení, klikněte na inteligentní značku ovládacího prvku zdroje dat a potom kliknutím na Konfigurovat zdroj datspusťte průvodce Konfigurací zdroje dat .
V kroku průvodce Konfigurovat ObjectContext vyberte SchoolEntities jako hodnotu Pojmenované připojení a jako hodnotu DefaultContainerName vyberte SchoolEntities. Potom klikněte na Další.
Poznámka: Pokud se v tomto okamžiku zobrazí následující dialogové okno, musíte projekt před pokračováním sestavit.
V kroku Konfigurovat výběr dat vyberte Lidé jako hodnotu EntitySetName. V části Vybrat se ujistěte, že je zaškrtnuté políčko Vybrat a ll. Pak vyberte možnosti pro povolení aktualizace a odstranění. Až budete hotovi, klikněte na Dokončit.
Konfigurace databázových pravidel tak, aby umožňovala odstranění
Vytvoříte stránku, která uživatelům umožní odstranit studenty z Person
tabulky, která má tři relace s jinými tabulkami (Course
, StudentGrade
a OfficeAssignment
). Ve výchozím nastavení vám databáze zabrání v odstranění řádku v Person
, pokud jsou v jedné z ostatních tabulek související řádky. Související řádky můžete nejprve odstranit ručně nebo můžete nakonfigurovat databázi tak, aby je při odstranění řádku odstranila Person
automaticky. V případě záznamů studentů v tomto kurzu nakonfigurujete databázi tak, aby automaticky odstranila související data. Vzhledem k tomu, že studenti můžou mít související řádky jenom v StudentGrade
tabulce, musíte nakonfigurovat jenom jednu ze tří relací.
Pokud používáte soubor School.mdf , který jste stáhli z projektu, který je v tomto kurzu, můžete tuto část přeskočit, protože tyto změny konfigurace už byly provedeny. Pokud jste databázi vytvořili spuštěním skriptu, nakonfigurujte databázi provedením následujících postupů.
V Průzkumníku serveru otevřete diagram databáze, který jste vytvořili v části 1. Klikněte pravým tlačítkem na relaci mezi Person
a StudentGrade
(na čáru mezi tabulkami) a pak vyberte Vlastnosti.
V okně Vlastnosti rozbalte položku INSERT a UPDATE Specification a nastavte vlastnost DeleteRule na Cascade.
Uložte a zavřete diagram. Pokud se zobrazí dotaz, jestli chcete databázi aktualizovat, klikněte na Ano.
Abyste měli jistotu, že model udržuje entity, které jsou v paměti, synchronizované s tím, co databáze dělá, musíte v datovém modelu nastavit odpovídající pravidla. Otevřete SchoolModel.edmx, klikněte pravým tlačítkem myši na spojnici přidružení mezi Person
a StudentGrade
a pak vyberte Vlastnosti.
V okně Vlastnosti nastavte End1 OnDelete na Cascade.
Uložte a zavřete soubor SchoolModel.edmx a pak projekt znovu sestavte.
Obecně platí, že když se databáze změní, máte několik možností, jak model synchronizovat:
- U určitých druhů změn (například přidání nebo aktualizace tabulek, zobrazení nebo uložených procedur) klikněte pravým tlačítkem myši na návrháře a vyberte Aktualizovat model z databáze , aby návrhář změny udělal automaticky.
- Znovu vygenerujte datový model.
- Proveďte ruční aktualizace, jako je tato.
V takovém případě byste mohli model znovu vygenerovat nebo aktualizovat tabulky ovlivněné změnou relace, ale pak byste museli změnit název pole znovu (z FirstName
na FirstMidName
).
Použití ovládacího prvku GridView ke čtení a aktualizaci entit
V této části použijete ovládací prvek GridView
k zobrazení, aktualizaci nebo odstranění studentů.
Otevřete soubor Students.aspx nebo na něj přepněte a přepněte do návrhového zobrazení. Na kartě Data v sadě nástrojů přetáhněte GridView
ovládací prvek napravo od ovládacího prvku, pojmenujte StudentsGridView
ho EntityDataSource
, klikněte na inteligentní značku a jako zdroj dat vyberte StudentsEntityDataSource.
Klikněte na Aktualizovat schéma (pokud se zobrazí výzva k potvrzení, klikněte na Ano ) a pak klikněte na Povolit stránkování, Povolit řazení, Povolit úpravy a Povolit odstranění.
Klikněte na Upravit sloupce.
V poli Vybraná pole odstraňte PersonID, LastName a HireDate. Obvykle uživatelům nezobrazujete klíč záznamu, datum přijetí není pro studenty relevantní a obě části jména vložíte do jednoho pole, takže potřebujete jenom jedno z polí se jménem.)
Vyberte pole FirstMidName a pak klikněte na Převést toto pole na TemplateField.
To samé udělejte pro EnrollmentDate.
Klikněte na OK a přepněte do zobrazení Zdroj . Zbývající změny se budou snadněji provádět přímo v přirážce. Značky GridView
ovládacího prvku teď vypadají jako v následujícím příkladu.
<asp:GridView ID="StudentsGridView" runat="server" AllowPaging="True"
AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="PersonID"
DataSourceID="StudentsEntityDataSource">
<Columns>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
<asp:TemplateField HeaderText="FirstMidName" SortExpression="FirstMidName">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("FirstMidName") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("FirstMidName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="EnrollmentDate" SortExpression="EnrollmentDate">
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("EnrollmentDate") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("EnrollmentDate") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
První sloupec za polem příkazu je pole šablony, které aktuálně zobrazuje křestní jméno. Změňte kód pro toto pole šablony tak, aby vypadal jako v následujícím příkladu:
<asp:TemplateField HeaderText="Name" SortExpression="LastName">
<EditItemTemplate>
<asp:TextBox ID="LastNameTextBox" runat="server" Text='<%# Bind("LastName") %>'></asp:TextBox>
<asp:TextBox ID="FirstNameTextBox" runat="server" Text='<%# Bind("FirstMidName") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="LastNameLabel" runat="server" Text='<%# Eval("LastName") %>'></asp:Label>,
<asp:Label ID="FirstNameLabel" runat="server" Text='<%# Eval("FirstMidName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
V režimu Label
zobrazení dva ovládací prvky zobrazují jméno a příjmení. V režimu úprav jsou k dispozici dvě textová pole, abyste mohli změnit jméno a příjmení. Label
Stejně jako u ovládacích prvků v režimu zobrazení se výrazy a Eval
používají Bind
přesně stejně jako u ovládacích prvků zdroje dat ASP.NET, které se připojují přímo k databázím. Jediným rozdílem je, že místo sloupců databáze zadáváte vlastnosti entity.
Poslední sloupec je pole šablony, které zobrazuje datum registrace. Změňte kód pro toto pole tak, aby vypadal jako v následujícím příkladu:
<asp:TemplateField HeaderText="Enrollment Date" SortExpression="EnrollmentDate">
<EditItemTemplate>
<asp:TextBox ID="EnrollmentDateTextBox" runat="server" Text='<%# Bind("EnrollmentDate", "{0:d}") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="EnrollmentDateLabel" runat="server" Text='<%# Eval("EnrollmentDate", "{0:d}") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
V režimu zobrazení i úprav formátovací řetězec {0,d} způsobí, že se datum zobrazí ve formátu krátkého data. (Počítač může být nakonfigurovaný tak, aby tento formát zobrazoval jinak než obrázky obrazovky zobrazené v tomto kurzu.)
Všimněte si, že v každém z těchto polí šablony návrhář ve výchozím nastavení použil Bind
výraz, ale změnili jste ho Eval
na výraz v elementech ItemTemplate
. Výraz Bind
zpřístupňuje data ve GridView
vlastnostech ovládacího prvku pro případ, že k datům potřebujete přistupovat v kódu. Na této stránce nepotřebujete přístup k datům v kódu, takže můžete použít Eval
, což je efektivnější. Další informace najdete v tématu Získání dat z ovládacích prvků dat.
Revize značek ovládacího prvku EntityDataSource za účelem zlepšení výkonu
Ve značkách EntityDataSource
ovládacího prvku odeberte ConnectionString
atributy a DefaultContainerName
a nahraďte je atributem ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
. Jedná se o změnu, kterou byste měli provést při každém vytvoření EntityDataSource
ovládacího prvku, pokud nepotřebujete použít připojení, které se liší od připojení, které je pevně zakódované ve třídě kontextu objektu. Použití atributu ContextTypeName
poskytuje následující výhody:
- Lepší výkon.
EntityDataSource
Když ovládací prvek inicializuje datový model pomocíConnectionString
atributů aDefaultContainerName
, provede další práci, aby načetl metadata pro každý požadavek. Pokud zadáteContextTypeName
atribut, není to nutné. - Opožděné načítání je ve výchozím nastavení zapnuté ve generovaných třídách kontextu objektů (například
SchoolEntities
v tomto kurzu) v Entity Framework 4.0. To znamená, že navigační vlastnosti se automaticky načtou se souvisejícími daty, když je potřebujete. Opožděné načítání je podrobněji vysvětleno později v tomto kurzu. - Všechna přizpůsobení, která jste použili u třídy kontextu objektu (v tomto případě
SchoolEntities
třídy), budou k dispozici ovládacím prvkůmEntityDataSource
, které ovládací prvek používají. Přizpůsobení třídy kontextu objektu je pokročilé téma, které není popsáno v této sérii kurzů. Další informace najdete v tématu Rozšíření typů vygenerovaných rozhraním Entity Framework.
Kód teď bude vypadat podobně jako v následujícím příkladu (pořadí vlastností se může lišit):
<asp:EntityDataSource ID="StudentsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False"
EntitySetName="People"
EnableDelete="True" EnableUpdate="True">
</asp:EntityDataSource>
Atribut EnableFlattening
odkazuje na funkci, která byla potřebná v dřívějších verzích Entity Frameworku, protože sloupce cizího klíče nebyly vystaveny jako vlastnosti entity. Aktuální verze umožňuje použití přidružení cizího klíče, což znamená, že vlastnosti cizího klíče jsou vystavené pro všechna přidružení s výjimkou přidružení M:N. Pokud vaše entity mají vlastnosti cizího klíče a žádné složité typy, můžete tento atribut nechat nastavený na False
. Neodstraňujte atribut ze značky, protože výchozí hodnota je True
. Další informace najdete v tématu Sloučení objektů (EntityDataSource).
Spusťte stránku a zobrazí se seznam studentů a zaměstnanců (v dalším kurzu vyfiltrujete jenom studenty). Jméno a příjmení se zobrazí společně.
Pokud chcete zobrazení seřadit, klikněte na název sloupce.
V libovolném řádku klikněte na Upravit . Zobrazí se textová pole, ve kterých můžete změnit jméno a příjmení.
Funguje také tlačítko Odstranit . Kliknutím na Odstranit zobrazíte řádek, který má datum registrace a řádek zmizí. (Řádky bez data registrace představují instruktory a může se zobrazit chyba referenční integrity. V dalším kurzu vyfiltrujete tento seznam tak, aby zahrnoval jenom studenty.)
Zobrazení dat z vlastnosti navigace
Teď předpokládejme, že chcete vědět, do kolika kurzů je každý student zaregistrovaný. Entity Framework poskytuje informace v StudentGrades
navigační vlastnosti Person
entity. Vzhledem k tomu, že návrh databáze neumožňuje, aby byl student zapsán do kurzu bez přiřazené známky, můžete pro účely tohoto kurzu předpokládat, že mít řádek v StudentGrade
tabulce, který je přidružený k předmětu, je stejný jako zápis do kurzu. (Vlastnost Courses
navigace je určena pouze pro instruktory.)
Při použití atributu ContextTypeName
EntityDataSource
ovládacího prvku Entity Framework automaticky načte informace pro vlastnost navigace při přístupu k této vlastnosti. To se nazývá opožděné načítání. To však může být neefektivní, protože výsledkem je samostatné volání databáze pokaždé, když jsou potřeba další informace. Pokud potřebujete data z vlastnosti navigace pro každou entitu EntityDataSource
vrácenou ovládacím prvekem, je efektivnější načíst související data spolu se samotnou entitou v jediném volání databáze. Tomu se říká nedočkavé načítání a nastavením vlastnosti EntityDataSource
ovládacího prvku určíte dychtivé načítání pro vlastnost Include
navigace.
V students.aspx chcete zobrazit počet kurzů pro každého studenta, takže nejlepší volbou je načítání. Pokud jste zobrazovali všechny studenty, ale zobrazovali jste počet kurzů jenom pro několik z nich (což by vyžadovalo napsání kódu kromě kódu), může být lepší volbou opožděné načítání.
Otevřete soubor Students.aspx nebo do něj přepněte, přepněte do návrhového zobrazení, vyberte StudentsEntityDataSource
a v okně Vlastnosti nastavte vlastnost Include na StudentGrades. (Pokud chcete získat více navigačních vlastností, můžete zadat jejich názvy oddělené čárkami – například StudentGrades, Courses.)
Přepněte do zobrazení Zdroj . StudentsGridView
Do ovládacího prvku za poslední asp:TemplateField
prvek přidejte následující nové pole šablony:
<asp:TemplateField HeaderText="Number of Courses">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval("StudentGrades.Count") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
Ve výrazu Eval
můžete odkazovat na vlastnost StudentGrades
navigace . Vzhledem k tomu, že tato vlastnost obsahuje kolekci, má Count
vlastnost, kterou můžete použít k zobrazení počtu kurzů, do kterých je student zapsán. V pozdějším kurzu se dozvíte, jak zobrazit data z navigačních vlastností, které obsahují jednotlivé entity místo kolekcí. (Všimněte si, že elementy nelze použít BoundField
k zobrazení dat z navigačních vlastností.)
Spusťte stránku a uvidíte, do kolika kurzů je každý student zaregistrovaný.
Vkládání entit pomocí ovládacího prvku DetailsView
Dalším krokem je vytvoření stránky s ovládacím prvek DetailsView
, který vám umožní přidat nové studenty. Zavřete prohlížeč a pak vytvořte novou webovou stránku pomocí stránky předlohy Site.Master . Pojmenujte stránku StudentsAdd.aspx a přepněte do zobrazení Zdroj .
Přidejte následující značku, která nahradí existující značku Content
ovládacího prvku s názvem Content2
:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Add New Students</h2>
<asp:EntityDataSource ID="StudentsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False"
EnableInsert="True" EntitySetName="People">
</asp:EntityDataSource>
<asp:DetailsView ID="StudentsDetailsView" runat="server"
DataSourceID="StudentsEntityDataSource" AutoGenerateRows="False"
DefaultMode="Insert">
<Fields>
<asp:BoundField DataField="FirstMidName" HeaderText="First Name"
SortExpression="FirstMidName" />
<asp:BoundField DataField="LastName" HeaderText="Last Name"
SortExpression="LastName" />
<asp:BoundField DataField="EnrollmentDate" HeaderText="Enrollment Date"
SortExpression="EnrollmentDate" />
<asp:CommandField ShowInsertButton="True" />
</Fields>
</asp:DetailsView>
</asp:Content>
Tento kód vytvoří EntityDataSource
ovládací prvek, který je podobný tomu, který jste vytvořili v souboru Students.aspx, s tím rozdílem, že umožňuje vložení. Stejně jako u GridView
ovládacího prvku jsou vázaná pole DetailsView
ovládacího prvku kódována přesně jako u ovládacího prvku dat, který se připojuje přímo k databázi, s tím rozdílem, že odkazují na vlastnosti entity. V tomto případě DetailsView
se ovládací prvek používá pouze pro vkládání řádků, takže jste nastavili výchozí režim na Insert
.
Spusťte stránku a přidejte nového studenta.
Po vložení nového studenta se nic nestane, ale pokud teď spustíte students.aspx, zobrazí se informace o novém studentovi.
Zobrazení dat v seznamu Drop-Down
V následujících krocích data připojíte DropDownList
ovládací prvek k sadě entit pomocí ovládacího prvku EntityDataSource
. V této části kurzu s tímto seznamem moc neuděláte. V dalších částech ale pomocí seznamu umožníte uživatelům vybrat oddělení, které zobrazí kurzy přidružené k danému oddělení.
Vytvořte novou webovou stránku s názvem Courses.aspx. V zobrazení Zdroj přidejte do Content
ovládacího prvku nadpis s názvem Content2
:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Courses by Department</h2>
</asp:Content>
V návrhovém zobrazení přidejte na stránku ovládací prvek EntityDataSource
stejně jako předtím, s výjimkou tohoto časového názvu DepartmentsEntityDataSource
. Jako hodnotu EntitySetName vyberte Departments (Oddělení) a vyberte pouze vlastnosti DepartmentID (Id oddělení) a Name (Název).
Na kartě Standardní na panelu nástrojů přetáhněte DropDownList
ovládací prvek na stránku, pojmenujte DepartmentsDropDownList
ho , klikněte na inteligentní značku a výběrem možnosti Zvolit zdroj dat spusťtePrůvodce konfigurací zdroje dat.
V kroku Zvolte zdroj dat vyberte Jako zdroj dat možnost DepartmentsEntityDataSource , klikněte na Aktualizovat schéma a pak vyberte Název jako datové pole, které chcete zobrazit, a Id oddělení jako datové pole hodnoty. Klikněte na OK.
Metoda, kterou použijete k vytvoření vazby ovládacího prvku pomocí Entity Frameworku, je stejná jako u jiných ovládacích prvků zdroje dat ASP.NET s tím rozdílem, že zadáváte entity a vlastnosti entit.
Přepněte do zobrazení Zdroj a bezprostředně před DropDownList
ovládací prvek přidejte možnost Vybrat oddělení.
Select a department:
<asp:DropDownList ID="DropDownList1" runat="server"
DataSourceID="EntityDataSource1" DataTextField="Name"
DataValueField="DepartmentID">
</asp:DropDownList>
Připomínáme, že v tomto okamžiku EntityDataSource
změňte značky ovládacího prvku nahrazením ConnectionString
atributů a DefaultContainerName
atributem ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
. Často je nejlepší počkat, až po vytvoření ovládacího prvku vázaného na data, který je propojený s ovládacím prvek zdroje dat, než změníte EntityDataSource
kód ovládacího prvku, protože po provedení změny vám návrhář neposkytne možnost Aktualizovat schéma v ovládacím prvku vázaném na data.
Spusťte stránku a v rozevíracím seznamu můžete vybrat oddělení.
Tím se dokončí úvod k používání EntityDataSource
ovládacího prvku. Práce s tímto ovládacím prvku se obecně neliší od práce s jinými ovládacími prvky ASP.NET zdrojů dat s tím rozdílem, že místo tabulek a sloupců odkazujete na entity a vlastnosti. Jedinou výjimkou je, když chcete získat přístup k navigačním vlastnostem. V dalším kurzu uvidíte, že syntaxe, kterou použijete s ovládacími EntityDataSource
prvky, se může při filtrování, seskupbě a řazení dat lišit od jiných ovládacích prvků zdroje dat.