Condividi tramite


Novità di Entity Framework 4.0

di Tom Dykstra

Questa serie di esercitazioni si basa sull'applicazione Web Contoso University creata dalla Introduzione con la serie di esercitazioni di Entity Framework. Se non sono state completate le esercitazioni precedenti, come punto di partenza per questa esercitazione è possibile scaricare l'applicazione creata. È anche possibile scaricare l'applicazione creata dalla serie completa di esercitazioni. Per domande sulle esercitazioni, è possibile pubblicarle nel forum di ASP.NET Entity Framework.

Nell'esercitazione precedente sono stati illustrati alcuni metodi per ottimizzare le prestazioni di un'applicazione Web che usa Entity Framework. Questa esercitazione esamina alcune delle nuove funzionalità più importanti nella versione 4 di Entity Framework e collega alle risorse che offrono un'introduzione più completa a tutte le nuove funzionalità. Le funzionalità evidenziate in questa esercitazione includono quanto segue:

  • Associazioni di chiavi esterne.
  • Esecuzione di comandi SQL definiti dall'utente.
  • Sviluppo model-first.
  • Supporto POCO.

Inoltre, l'esercitazione introdurrà brevemente lo sviluppo code-first, una funzionalità disponibile nella prossima versione di Entity Framework.

Per avviare l'esercitazione, avviare Visual Studio e aprire l'applicazione Web Contoso University usata nell'esercitazione precedente.

associazioni Foreign-Key

La versione 3.5 di Entity Framework includeva le proprietà di navigazione, ma non includeva proprietà di chiave esterna nel modello di dati. Ad esempio, le CourseID colonne e StudentID della StudentGrade tabella vengono omesse dall'entità StudentGrade .

Immagine01

Il motivo di questo approccio è che, in modo rigoroso, le chiavi esterne sono un dettaglio di implementazione fisica e non appartengono a un modello di dati concettuale. Tuttavia, in pratica, è spesso più facile lavorare con le entità nel codice quando si ha accesso diretto alle chiavi esterne.

Per un esempio del modo in cui le chiavi esterne nel modello di dati possono semplificare il codice, considerare come sarebbe stato necessario codificare la pagina DepartmentsAdd.aspx senza di esse. Nell'entità Department la Administrator proprietà è una chiave esterna corrispondente all'entità PersonIDPerson . Per stabilire l'associazione tra un nuovo reparto e il relativo amministratore, è stato impostato il valore per la Administrator proprietà nel ItemInserting gestore eventi del controllo databound:

protected void DepartmentsDetailsView_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
    e.Values["Administrator"] = administratorsDropDownList.SelectedValue;
}

Senza chiavi esterne nel modello di dati, è necessario gestire l'evento Inserting del controllo origine dati anziché l'evento ItemInserting del controllo databound per ottenere un riferimento all'entità stessa prima che l'entità venga aggiunta al set di entità. Quando si dispone di tale riferimento, si stabilisce l'associazione usando codice simile al seguente negli esempi seguenti:

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));

Come si può vedere nel post di blog del team di Entity Framework sulle associazioni di chiavi esterne, esistono altri casi in cui la differenza nella complessità del codice è molto più grande. Per soddisfare le esigenze di coloro che preferiscono vivere con i dettagli di implementazione nel modello di dati concettuali per semplificare il codice, Entity Framework offre ora la possibilità di includere chiavi esterne nel modello di dati.

Nella terminologia di Entity Framework, se si includono chiavi esterne nel modello di dati si usano associazioni di chiavi esterne e se si escludono chiavi esterne si usano associazioni indipendenti.

Esecuzione di comandi SQL User-Defined

Nelle versioni precedenti di Entity Framework non è stato possibile creare comandi SQL personalizzati in tempo reale ed eseguirli. Entity Framework ha generato automaticamente i comandi SQL oppure è stato necessario creare una stored procedure e importarla come funzione. La versione 4 aggiunge ExecuteStoreQuery metodi e ExecuteStoreCommand la ObjectContext classe che semplificano il passaggio di qualsiasi query direttamente al database.

Si supponga che gli amministratori di Contoso University vogliano eseguire modifiche in blocco nel database senza dover eseguire il processo di creazione di una stored procedure e l'importazione nel modello di dati. La prima richiesta è per una pagina che consente di modificare il numero di crediti per tutti i corsi nel database. Nella pagina Web, vogliono essere in grado di immettere un numero da usare per moltiplicare il valore della colonna di Credits ogni Course riga.

Creare una nuova pagina che usa la pagina master Site.Master e denominarla UpdateCredits.aspx. Aggiungere quindi il markup seguente al Content controllo denominato Content2:

<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 />

Questo markup crea un TextBox controllo in cui l'utente può immettere il valore del moltiplicatore, un Button controllo da fare clic per eseguire il comando e un Label controllo per indicare il numero di righe interessate.

Aprire UpdateCredits.aspx.cs e aggiungere l'istruzione seguente using e un gestore per l'evento del Click pulsante:

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();
    }
}

Questo codice esegue il comando SQL Update usando il valore nella casella di testo e usa l'etichetta per visualizzare il numero di righe interessate. Prima di eseguire la pagina, eseguire la pagina Courses.aspx per ottenere un'immagine "prima" di alcuni dati.

Immagine02

Eseguire UpdateCredits.aspx, immettere "10" come moltiplicatore e quindi fare clic su Esegui.

Immagine03

Eseguire di nuovo la pagina Courses.aspx per visualizzare i dati modificati.

Immagine04

Se si vuole impostare nuovamente il numero di crediti sui valori originali, in UpdateCredits.aspx.cs modificare Credits * {0} e rieseguire Credits / {0} la pagina, immettendo 10 come divisore.

Per altre informazioni sull'esecuzione di query definite nel codice, vedere Procedura: Eseguire direttamente i comandi sull'origine dati.

sviluppo di Model-First

In queste procedure dettagliate è stato prima creato il database e quindi è stato generato il modello di dati in base alla struttura del database. In Entity Framework 4 è possibile iniziare con il modello di dati e generare il database in base alla struttura del modello di dati. Se si sta creando un'applicazione per la quale il database non esiste già, l'approccio model-first consente di creare entità e relazioni che hanno senso concettualmente per l'applicazione, senza preoccuparsi dei dettagli dell'implementazione fisica. (Ciò rimane vero solo nelle fasi iniziali dello sviluppo, tuttavia. Alla fine il database verrà creato e avrà i dati di produzione in esso contenuti e ricreandolo dal modello non sarà più pratico; a questo punto si tornerà all'approccio database-first.

In questa sezione dell'esercitazione si creerà un modello di dati semplice e verrà generato il database.

In Esplora soluzioni fare clic con il pulsante destro del mouse sulla cartella DAL e scegliere Aggiungi nuovo elemento. Nella finestra di dialogo Aggiungi nuovo elemento , in Modelli installati selezionare Dati e quindi selezionare il modello Entity Data Model ADO.NET . Denominare il nuovo file AlunniAssociationModel.edmx e fare clic su Aggiungi.

Image06

Verrà avviata la Creazione guidata modello di dati di entità. Nel passaggio Scegli contenuto modello selezionare Modello vuoto e quindi fare clic su Fine.

Immagine07

Il Designer Entity Data Model viene aperto con un'area di progettazione vuota. Trascinare un elemento Entity dalla casella degli strumenti nell'area di progettazione.

Immagine08

Modificare il nome dell'entità da Entity1 a Alumnus, modificare il nome AlumnusIddella Id proprietà in e aggiungere una nuova proprietà scalare denominata Name. Per aggiungere nuove proprietà è possibile premere INVIO dopo aver modificato il nome della Id colonna oppure fare clic con il pulsante destro del mouse sull'entità e scegliere Aggiungi proprietà scalare. Il tipo predefinito per le nuove proprietà è String, che va bene per questa semplice dimostrazione, ma naturalmente è possibile modificare elementi come il tipo di dati nella finestra Proprietà .

Creare un'altra entità allo stesso modo e denominarla Donation. Modificare la Id proprietà DonationId in e aggiungere una proprietà scalare denominata DateAndAmount.

Immagine09

Per aggiungere un'associazione tra queste due entità, fare clic con il pulsante destro del mouse sull'entità Alumnus , scegliere Aggiungi e quindi selezionare Associazione.

Image10

I valori predefiniti nella finestra di dialogo Aggiungi associazione sono gli elementi desiderati (uno-a-molti, includere le proprietà di navigazione, includere chiavi esterne), quindi fare clic su OK.

Immagine11

La finestra di progettazione aggiunge una linea di associazione e una proprietà di chiave esterna.

Immagine12

A questo momento si è pronti per creare il database. Fare clic con il pulsante destro del mouse sull'area di progettazione e scegliere Genera database da modello.

Immagine13

Verrà avviata la Generazione guidata database. Se vengono visualizzati avvisi che indicano che le entità non sono mappate, è possibile ignorare quelle per il momento.

Nel passaggio Scegli connessione dati fare clic su Nuova connessione.

Immagine14

Nella finestra di dialogo Proprietà connessione selezionare l'istanza locale SQL Server Express e assegnare al database AlumniAssociationil nome .

Immagine15

Fare clic su quando viene chiesto se si vuole creare il database. Quando viene visualizzato di nuovo il passaggio Scegli connessione dati , fare clic su Avanti.

Nel passaggio Riepilogo e impostazioni fare clic su Fine.

Image18

Viene creato un file con estensione sql con i comandi DDL (Data Definition Language), ma i comandi non sono ancora stati eseguiti.

Immagine20

Usare uno strumento come SQL Server Management Studio per eseguire lo script e creare le tabelle, come è possibile che sia stato creato il School database per la prima esercitazione nella serie di esercitazioni Introduzione. A meno che non sia stato scaricato il database.

È ora possibile usare il AlumniAssociation modello di dati nelle pagine Web nello stesso modo in cui si usa il School modello. Per provare a eseguire questa operazione, aggiungere alcuni dati alle tabelle e creare una pagina Web che visualizza i dati.

Usando Esplora server, aggiungere le righe seguenti alle Alumnus tabelle e Donation .

Immagine21

Creare una nuova pagina Web denominata Alunni.aspx che usa la pagina master Site.Master . Aggiungere il markup seguente al Content controllo denominato Content2:

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

Questo markup crea controlli annidati GridView , quello esterno per visualizzare i nomi degli studenti e quello interno per visualizzare le date e gli importi delle donazioni.

Aprire Alunni.aspx.cs. Aggiungere un'istruzione using per il livello di accesso ai dati e un gestore per l'evento del RowDataBound controllo esternoGridView:

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();
    }
}

Questo codice consente di associare il controllo interno GridView usando la Donations proprietà di navigazione dell'entità della Alumnus riga corrente.

Eseguire la pagina.

Immagine22

Nota: questa pagina è inclusa nel progetto scaricabile, ma per farlo funzionare è necessario creare il database nell'istanza di SQL Server Express locale. Il database non è incluso come file mdf nella cartella App_Data.

Per altre informazioni sull'uso della funzionalità model-first di Entity Framework, vedere Model-First in Entity Framework 4.

Supporto POCO

Quando si usa la metodologia di progettazione basata su dominio, si progettano classi di dati che rappresentano dati e comportamenti rilevanti per il dominio aziendale. Queste classi devono essere indipendenti da qualsiasi tecnologia specifica usata per archiviare (rendere persistenti) i dati; in altre parole, dovrebbero essere persistenza ignorante. L'ignoranza della persistenza può anche semplificare lo unit test di una classe perché il progetto di unit test può usare qualsiasi tecnologia di persistenza sia più conveniente per i test. Le versioni precedenti di Entity Framework offrivano un supporto limitato per l'ignoranza della persistenza perché le classi di entità dovevano ereditare dalla EntityObject classe e includevano quindi una grande quantità di funzionalità specifiche di Entity Framework.

Entity Framework 4 introduce la possibilità di usare classi di entità che non ereditano dalla EntityObject classe e pertanto non sono persistenti. Nel contesto di Entity Framework, le classi come questa sono in genere denominate oggetti CLR normali (POCO o POCO). È possibile scrivere manualmente classi POCO oppure generarle automaticamente in base a un modello di dati esistente usando modelli T4 (Text Template Transformation Toolkit) forniti da Entity Framework.

Per altre informazioni sull'uso di poCO in Entity Framework, vedere le risorse seguenti:

sviluppo di Code-First

Il supporto POCO in Entity Framework 4 richiede comunque di creare un modello di dati e collegare le classi di entità al modello di dati. La versione successiva di Entity Framework includerà una funzionalità denominata sviluppo code-first. Questa funzionalità consente di usare Entity Framework con le proprie classi POCO senza dover usare progettazione modelli di dati o un file XML del modello di dati. Pertanto, questa opzione è stata chiamata anche solo codice; code-first e solo codice fanno riferimento alla stessa funzionalità di Entity Framework.

Per altre informazioni sull'uso dell'approccio code-first per lo sviluppo, vedere le risorse seguenti:

Inoltre, una nuova esercitazione di Code-First MVC che compila un'applicazione simile all'applicazione Contoso University verrà pubblicata nella primavera del 2011 all'indirizzo https://asp.net/entity-framework/tutorials

Altre informazioni

In questo modo viene completata la panoramica delle novità di Entity Framework e della serie di esercitazioni continue con Entity Framework. Per altre informazioni sulle nuove funzionalità di Entity Framework 4 non descritte qui, vedere le risorse seguenti: