Novinky v sadě Entity Framework 4.0
Tato série kurzů vychází z webové aplikace Contoso University vytvořené Začínáme s využitím série kurzů Entity Framework. Pokud jste nedokončí předchozí kurzy, jako výchozí bod pro tento kurz si můžete stáhnout aplikaci , kterou jste vytvořili. Můžete si také stáhnout aplikaci vytvořenou v rámci celé série kurzů. Pokud máte dotazy ke kurzům, můžete je publikovat na fóru ASP.NET Entity Framework.
V předchozím kurzu jste viděli některé metody pro maximalizaci výkonu webové aplikace, která používá Entity Framework. V tomto kurzu se probíjí některé z nejdůležitějších nových funkcí ve verzi 4 entity Frameworku a odkazy na prostředky, které poskytují úplnější úvod ke všem novým funkcím. Mezi funkce zvýrazněné v tomto kurzu patří:
- Přidružení cizího klíče.
- Spouštění uživatelsky definovaných příkazů SQL
- Vývoj založený na modelu.
- Podpora POCO.
Kromě toho tento kurz stručně představí vývoj založený na kódu, funkci, která bude k dispozici v příští verzi Entity Frameworku.
Kurz zahájíte tak, že spustíte Visual Studio a otevřete webovou aplikaci Contoso University, se kterou jste pracovali v předchozím kurzu.
Foreign-Key přidružení
Verze 3.5 entity frameworku obsahovala navigační vlastnosti, ale do datového modelu nezahrnovala vlastnosti cizího klíče. Například CourseID
sloupce StudentGrade
a StudentID
tabulky by byly z StudentGrade
entity vynechány.
Důvodem tohoto přístupu bylo, přesněji řečeno, cizí klíče jsou detaily fyzické implementace a nepatří do konceptuálního datového modelu. V praxi je ale práce s entitami v kódu často jednodušší, když máte přímý přístup k cizím klíčům.
Příklad, jak cizí klíče v datovém modelu můžou zjednodušit kód, zvažte, jak byste museli kódovat stránku DepartmentsAdd.aspx bez nich. V entitě Department
Administrator
je vlastnost cizí klíč, který odpovídá PersonID
v entitě Person
. Abyste mohli vytvořit přidružení mezi novým oddělením a jeho správcem, stačí nastavit hodnotu Administrator
vlastnosti v obslužné rutině ItemInserting
události ovládacího prvku pro příchozí data:
protected void DepartmentsDetailsView_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
e.Values["Administrator"] = administratorsDropDownList.SelectedValue;
}
Bez cizích klíčů v datovém modelu byste místo události ovládacího prvku pro příchozí data zpracovávali Inserting
událost ovládacího ItemInserting
prvku zdroje dat, abyste získali odkaz na samotnou entitu předtím, než se entita přidá do sady entit. Když máte tento odkaz, vytvoříte přidružení pomocí kódu podobného v následujících příkladech:
departmentEntityToBeInserted.PersonReference.EntityKey = new System.Data.EntityKey("SchoolEntities.Departments", "PersonID", Convert.ToInt32(administratorsDropDownList.SelectedValue));
departmentEntityToBeInserted.Person = context.People.Single(p => p.PersonID == Convert.ToInt32(administratorsDropDownList.SelectedValue));
Jak můžete vidět v blogovém příspěvku týmu Entity Framework o přidružení cizích klíčů, existují i jiné případy, kdy je rozdíl ve složitosti kódu mnohem větší. Aby bylo možné splnit potřeby těch, kteří raději žijí s podrobnostmi implementace v konceptuálním datovém modelu kvůli jednoduššímu kódu, nabízí Entity Framework možnost zahrnout do datového modelu cizí klíče.
V terminologii Entity Framework platí, že pokud do datového modelu zahrnete cizí klíče, použijete přidružení cizích klíčů, a pokud vyloučíte cizí klíče, použijete nezávislá přidružení.
Spouštění příkazů SQL User-Defined
V dřívějších verzích Entity Frameworku neexistoval snadný způsob, jak rychle vytvářet vlastní příkazy SQL a spouštět je. Entity Framework buď dynamicky vygeneroval příkazy SQL za vás, nebo jste museli vytvořit uloženou proceduru a importovat ji jako funkci. Verze 4 přidává ExecuteStoreQuery
a ExecuteStoreCommand
metody ObjectContext
třídy , které usnadňují předání libovolného dotazu přímo do databáze.
Předpokládejme, že správci Contoso University chtějí mít možnost provádět hromadné změny v databázi, aniž by museli procházet procesem vytvoření uložené procedury a jejím importem do datového modelu. Jejich první žádost je o stránku, která jim umožní změnit počet kreditů pro všechny kurzy v databázi. Na webové stránce chce mít možnost zadat číslo, které použije k vynásobení hodnoty sloupce každého Course
řádku Credits
.
Vytvořte novou stránku, která používá stránku předlohy Site.Master , a pojmenujte ji UpdateCredits.aspx. Pak do ovládacího prvku s názvem Content2
přidejte následující kód Content
:
<h2>Update Credits</h2>
Enter the number to multiply the current number of credits by:
<asp:TextBox ID="CreditsMultiplierTextBox" runat="server"></asp:TextBox>
<br /><br />
<asp:Button ID="ExecuteButton" runat="server" Text="Execute" OnClick="ExecuteButton_Click" /><br /><br />
Rows affected:
<asp:Label ID="RowsAffectedLabel" runat="server" Text="0" ViewStateMode="Disabled"></asp:Label><br /><br />
Tento kód vytvoří TextBox
ovládací prvek, do kterého může uživatel zadat hodnotu násobitele, Button
ovládací prvek, na který se má kliknout, aby se příkaz spustil, a Label
ovládací prvek pro určení počtu ovlivněných řádků.
Otevřete Soubor UpdateCredits.aspx.cs a přidejte následující using
příkaz a obslužnou rutinu pro událost tlačítka Click
:
using ContosoUniversity.DAL;
protected void ExecuteButton_Click(object sender, EventArgs e)
{
using (SchoolEntities context = new SchoolEntities())
{
RowsAffectedLabel.Text = context.ExecuteStoreCommand("UPDATE Course SET Credits = Credits * {0}", CreditsMultiplierTextBox.Text).ToString();
}
}
Tento kód spustí příkaz SQL Update
pomocí hodnoty v textovém poli a pomocí popisku zobrazí počet ovlivněných řádků. Před spuštěním stránky spusťte stránku Courses.aspx , abyste získali obrázek před některými daty.
Spusťte UpdateCredits.aspx, jako násobitel zadejte "10" a klikněte na Execute ( Provést).
Znovu spusťte stránku Courses.aspx a prohlédněte si změněná data.
(Pokud chcete nastavit počet kreditů zpět na původní hodnoty, změňte Credits * {0}
v souboru UpdateCredits.aspx.cs na Credits / {0}
a spusťte stránku znovu a jako dělitel zadejte 10.)
Další informace o provádění dotazů, které definujete v kódu, najdete v tématu Postupy: Přímé spouštění příkazů proti zdroji dat.
vývoj Model-First
V těchto názorných krocích jste nejprve vytvořili databázi a pak vygenerovali datový model založený na struktuře databáze. V Entity Frameworku 4 můžete místo toho začít s datovým modelem a vygenerovat databázi na základě struktury datového modelu. Pokud vytváříte aplikaci, pro kterou databáze ještě neexistuje, přístup založený na modelu umožňuje vytvářet entity a relace, které mají pro aplikaci smysl, aniž byste se museli starat o podrobnosti fyzické implementace. (To však platí pouze v počátečních fázích vývoje. Nakonec bude databáze vytvořena a bude mít produkční data a opětovné vytvoření z modelu již nebude praktické; v tomto okamžiku se vrátíte k přístupu zaměřenému na databázi.)
V této části kurzu vytvoříte jednoduchý datový model a vygenerujete z něj databázi.
V Průzkumník řešení klikněte pravým tlačítkem na složku DAL a vyberte Přidat novou položku. V dialogovém okně Přidat novou položku v části Nainstalované šablony vyberte Data a pak vyberte šablonu ADO.NET Entity Data Model . Pojmenujte nový soubor AlumniAssociationModel.edmx a klikněte na Přidat.
Tím se spustí Průvodce modelem dat entity. V kroku Zvolit obsah modelu vyberte Prázdný model a pak klikněte na Dokončit.
Designer Entity Data Model se otevře s prázdnou návrhovou plochou. Přetáhněte položku Entity z panelu nástrojů na návrhovou plochu.
Změňte název entity z Entity1
na Alumnus
, změňte Id
název vlastnosti na AlumnusId
a přidejte novou skalární vlastnost s názvem Name
. Pokud chcete přidat nové vlastnosti, můžete po změně názvu Id
sloupce stisknout Enter nebo kliknout pravým tlačítkem na entitu a vybrat Přidat skalární vlastnost. Výchozí typ pro nové vlastnosti je , což je String
pro tuto jednoduchou ukázku v pořádku, ale samozřejmě můžete změnit datové typy v okně Vlastnosti .
Stejným způsobem vytvořte další entitu a pojmenujte ji Donation
. Změňte vlastnost na Id
DonationId
a přidejte skalární vlastnost s názvem DateAndAmount
.
Pokud chcete přidat přidružení mezi tyto dvě entity, klikněte na entitu Alumnus
pravým tlačítkem, vyberte Přidat a pak vyberte Přidružení.
Výchozí hodnoty v dialogovém okně Přidat přidružení jsou požadované (1:N, zahrnují navigační vlastnosti, zahrnují cizí klíče), takže stačí kliknout na OK.
Návrhář přidá asociační čáru a vlastnost cizího klíče.
Teď jste připraveni vytvořit databázi. Klikněte pravým tlačítkem na návrhovou plochu a vyberte Vygenerovat databázi z modelu.
Tím spustíte Průvodce generováním databáze. (Pokud se zobrazí upozornění, že entity nejsou namapované, můžete je prozatím ignorovat.)
V kroku Zvolte datové připojení klikněte na Nové připojení.
V dialogovém okně Vlastnosti připojení vyberte místní instanci SQL Server Express a pojmenujte databázi AlumniAssociation
.
Když se zobrazí dotaz, jestli chcete vytvořit databázi, klikněte na Ano . Až se znovu zobrazí krok Zvolte datové připojení , klikněte na Další.
V kroku Souhrn a nastavení klikněte na Dokončit.
Vytvoří se soubor .sql s příkazy jazyka DDL (Data Definition Language), ale příkazy se ještě nespustily.
Pomocí nástroje, jako je například SQL Server Management Studio, spusťte skript a vytvořte tabulky, jako jste to mohli udělat při vytváření School
databáze pro první kurz v sérii kurzů Začínáme. (Pokud jste si databázi nestahli.)
Datový model teď můžete na svých webových stránkách používat AlumniAssociation
stejným způsobem, jakým jste ho School
používali. Pokud si to chcete vyzkoušet, přidejte do tabulek nějaká data a vytvořte webovou stránku, která tato data zobrazí.
Pomocí Průzkumníka serveru přidejte do Alumnus
tabulek a Donation
následující řádky.
Vytvořte novou webovou stránku S názvem Alumni.aspx , která používá stránku předlohy Site.Master . Do ovládacího prvku s Content
názvem Content2
přidejte následující kód :
<h2>Alumni</h2>
<asp:EntityDataSource ID="AlumniEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.AlumniAssociationModelContainer" EnableFlattening="False"
EntitySetName="Alumni">
</asp:EntityDataSource>
<asp:GridView ID="AlumniGridView" runat="server"
DataSourceID="AlumniEntityDataSource" AutoGenerateColumns="False"
OnRowDataBound="AlumniGridView_RowDataBound"
DataKeyNames="AlumnusId">
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
<asp:TemplateField HeaderText="Donations">
<ItemTemplate>
<asp:GridView ID="DonationsGridView" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="DateAndAmount" HeaderText="Date and Amount" />
</Columns>
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Tento kód vytvoří vnořené GridView
ovládací prvky, vnější ovládací prvky pro zobrazení jmen absolventů a vnitřní pro zobrazení dat a částek darů.
Otevřete soubor Alumni.aspx.cs. using
Přidejte příkaz pro vrstvu přístupu k datům a obslužnou rutinu události vnějšího GridView
RowDataBound
ovládacího prvku:
using ContosoUniversity.DAL;
// ...
protected void AlumniGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var alumnus = e.Row.DataItem as Alumnus;
var donationsGridView = (GridView)e.Row.FindControl("DonationsGridView");
donationsGridView.DataSource = alumnus.Donations.ToList();
donationsGridView.DataBind();
}
}
Tento kód databinuje vnitřní GridView
ovládací prvek pomocí Donations
navigační vlastnosti entity aktuálního Alumnus
řádku.
Spusťte stránku.
(Poznámka: Tato stránka je součástí projektu ke stažení, ale aby fungovala, musíte vytvořit databázi v místní instanci SQL Server Express; databáze není zahrnuta jako soubor .mdf ve složce App_Data.)
Další informace o použití funkce model-first entity Framework najdete v tématu Model-First v Entity Framework 4.
Podpora objektů POCO
Při použití metodologie návrhu řízeného doménou navrhujete datové třídy, které představují data a chování, které jsou relevantní pro obchodní doménu. Tyto třídy by měly být nezávislé na jakékoli konkrétní technologii používané k ukládání (uchování) dat; jinými slovy, měli by být trvalí ignoranti. Nevědomost trvalosti může také usnadnit testování jednotek třídy, protože projekt testování jednotek může použít jakoukoli technologii trvalosti, která je pro testování nejvhodnější. Starší verze Entity Frameworku nabízely omezenou podporu pro trvalost nevědomosti, protože třídy entit musely dědit z EntityObject
třídy, a proto zahrnovaly velkou část funkcí specifických pro Entity Framework.
Entity Framework 4 zavádí možnost používat třídy entit, které nedědí EntityObject
z třídy, a proto jsou trvalost ignorant. V kontextu Entity Frameworku se třídy, jako je tato, obvykle nazývají prosté staré objekty CLR (POCO nebo POCO). Třídy POCO můžete psát ručně nebo je můžete automaticky vygenerovat na základě existujícího datového modelu pomocí šablon sady nástrojů T4 (Text Template Transformation Toolkit) poskytovaných rozhraním Entity Framework.
Další informace o používání objektů POCO v Entity Frameworku najdete v následujících zdrojích informací:
- Práce s entitami POCO Toto je dokument MSDN, který je přehledem objektů POCO s odkazy na další dokumenty s podrobnějšími informacemi.
- Návod: Šablona POCO pro Entity Framework Toto je blogový příspěvek od vývojového týmu Entity Framework s odkazy na další blogové příspěvky o POCO.
vývoj Code-First
Podpora POCO v Entity Frameworku 4 stále vyžaduje vytvoření datového modelu a propojení tříd entit s datovým modelem. Příští verze Entity Frameworku bude obsahovat funkci označovanou jako vývoj založený na kódu. Tato funkce umožňuje používat Entity Framework s vlastními třídami POCO bez použití návrháře datového modelu nebo souboru XML datového modelu. (Proto byla tato možnost také označována jako pouze pro kód; code-first i code-only odkazují na stejnou funkci Entity Framework.)
Další informace o použití přístupu k vývoji založeného na kódu najdete v následujících zdrojích informací:
- Vývoj založený na kódu pomocí Entity Frameworku 4. Toto je blogový příspěvek Scotta Guthrieho, který představuje vývoj založený na kódu.
- Blog vývojového týmu Entity Frameworku – příspěvky označené KódOnly
- Blog vývojového týmu Entity Frameworku – příspěvky označené kódem
- Kurz pro MVC Music Store – část 4: Modely a přístup k datům
- Začínáme s MVC 3 – část 4: Vývoj Code-First entity frameworku
Kromě toho se na jaře roku 2011 chystá publikovat nový kurz MVC Code-First, který sestaví aplikaci podobnou aplikaci Contoso University. https://asp.net/entity-framework/tutorials
Další informace
Tím se dokončí přehled novinek v Entity Frameworku a tato série kurzů Pokračování v Entity Frameworku. Další informace o nových funkcích v Entity Frameworku 4, které tu nejsou popsané, najdete v následujících zdrojích informací:
- Novinky v ADO.NET Téma MSDN o nových funkcích ve verzi 4 entity frameworku
- Oznamujeme vydání Entity Frameworku 4 Blogový příspěvek vývojového týmu Entity Frameworku o nových funkcích ve verzi 4