Sdílet prostřednictvím


Novinky v sadě Entity Framework 4.0

Tom Dykstra

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.

Obrázek 01

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ě DepartmentAdministrator 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 Content2př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.

Obrázek 02

Spusťte UpdateCredits.aspx, jako násobitel zadejte "10" a klikněte na Execute ( Provést).

Obrázek 03

Znovu spusťte stránku Courses.aspx a prohlédněte si změněná data.

Obrázek 04

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

Obrázek 06

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.

Obrázek 07

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.

Obrázek 08

Změňte název entity z Entity1 na Alumnus, změňte Id název vlastnosti na AlumnusIda 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 Stringpro 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 IdDonationId a přidejte skalární vlastnost s názvem DateAndAmount.

Obrázek 09

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

Obrázek 10

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.

Obrázek 11

Návrhář přidá asociační čáru a vlastnost cizího klíče.

Obrázek 12

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.

Obrázek 13

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

Obrázek 14

V dialogovém okně Vlastnosti připojení vyberte místní instanci SQL Server Express a pojmenujte databázi AlumniAssociation.

Obrázek 15

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.

Obrázek 18

Vytvoří se soubor .sql s příkazy jazyka DDL (Data Definition Language), ale příkazy se ještě nespustily.

Obrázek 20

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.

Obrázek 21

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 Content2př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 GridViewRowDataBound 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.

Obrázek 22

(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í:

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í:

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í: