Condividi tramite


Novità di Entity Framework 4.0

di Tom Dykstra

Questa serie di esercitazioni si basa sull'applicazione Web Contoso University creata dalla serie di esercitazioni introduzione a 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 di esercitazioni completa. Per domande sulle esercitazioni, è possibile pubblicarle nel forum di Entity Framework ASP.NET.

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 forniscono 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 orientato ai modelli (model-first).
  • Supporto POCO.

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

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

Associazioni Chiave Esterna

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

Immagine01

Il motivo di questo approccio era 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 usare 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 proprietà Administrator è una chiave esterna che corrisponde a PersonID nell'entità Person. Per stabilire l'associazione tra un dipartimento nuovo e il relativo amministratore, devi impostare 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 a quello 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 maggiore. 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 che si usano associazioni indipendenti.

Esecuzione di comandi SQL definiti dall'utente

Nelle versioni precedenti di Entity Framework non esiste un modo semplice per creare i propri comandi SQL in tempo reale ed eseguirli. Entity Framework ha generato in modo dinamico 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 è relativa a una pagina che consente di modificare il numero di crediti per tutti i corsi nel database. Nella pagina Web devono poter immettere un numero da usare per moltiplicare il valore di ogni colonna della riga CourseCredits.

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.

Image04

Se si desidera impostare nuovamente il numero di crediti sui valori originali, in UpdateCredits.aspx.cs modificare Credits * {0}Credits / {0} e ripetere l'esecuzione della pagina, immettendo 10 come divisore.

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

Lo sviluppo Model-First

In queste procedure dettagliate è stato creato prima 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 cui 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. Questo 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 si genererà il database da esso.

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 AlumniAssociationModel.edmx e fare clic su Aggiungi.

Image06

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

Image07

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

Image08

Modificare il nome dell'entità da Entity1 a , modificare il nome della Alumnus proprietà in Ide aggiungere una nuova proprietà scalare denominata AlumnusIdName. Per aggiungere nuove proprietà, è possibile premere INVIO dopo aver modificato il nome della colonna oppure fare clic con il pulsante destro del Id 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à in DonationId e aggiungere una proprietà scalare denominata DateAndAmount.

Image09

Per aggiungere un'associazione tra queste due entità, fare clic con il pulsante destro del mouse sull'entità Alumnus , selezionare Aggiungi e quindi scegliere 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.

Image11

Il progettista aggiunge una linea di associazione e una proprietà di chiave esterna.

Image12

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

Image13

Questo avvia la Creazione guidata Database. Se vengono visualizzati avvisi che indicano che le entità non sono mappate, è possibile ignorarli per il momento.

Nel passaggio Scegli connessione dati fare clic su Nuova connessione.

Image14

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

Image15

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

Nel passaggio Riepilogo e impostazioni fare clic su Fine.

Image18

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

Image20

Usare uno strumento come SQL Server Management Studio per eseguire lo script e creare le tabelle, come si potrebbe aver fatto al momento della creazione del School database per la prima esercitazione della serie di esercitazioni introduttive. 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, 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 .

Image21

Creare una nuova pagina Web denominata Alumni.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 ex studenti e quello interno per visualizzare date e importi di donazione.

Aprire Alumni.aspx.cs. Aggiungere un'istruzione using per il livello di accesso ai dati e un gestore per l'evento del controllo esterno GridViewRowDataBound:

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 collega i dati al controllo interno GridView mediante la proprietà di navigazione Donations dell'entità Alumnus della riga corrente.

Eseguire la pagina.

Image22

Nota: questa pagina è inclusa nel progetto scaricabile, ma per farlo funzionare è necessario creare il database nell'istanza locale di SQL Server Express. 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 ignoranti persistenza. 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 capacità di usare classi di entità che non ereditano dalla classe EntityObject e pertanto ignorano la persistenza. Nel contesto di Entity Framework, le classi di questo tipo sono in genere denominate oggetti CLR semplici (POCO o POCO). È possibile scrivere manualmente classi POCO oppure generarle automaticamente in base a un modello di dati esistente usando modelli di Text Template Transformation Toolkit (T4) forniti da Entity Framework.

Per altre informazioni sull'uso di POCO nell'Entity Framework, vedere le risorse seguenti.

Sviluppo 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 allo sviluppo, vedere le risorse seguenti:

Inoltre, una nuova esercitazione 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 di questa serie di esercitazioni continue con Entity Framework. Per altre informazioni sulle nuove funzionalità di Entity Framework 4 non descritte qui, vedere le risorse seguenti: