Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 .
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.
Eseguire UpdateCredits.aspx, immettere "10" come moltiplicatore e quindi fare clic su Esegui.
Eseguire di nuovo la pagina Courses.aspx per visualizzare i dati modificati.
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.
Avvia la Creazione guidata del modello dati entità. Nel passaggio Scegli contenuto modello selezionare Modello vuoto e quindi fare clic su Fine.
Entity Data Model Designer viene aperto con un'area di progettazione vuota. Trascinare un elemento Entity dalla casella degli strumenti nell'area di progettazione.
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.
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.
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.
Il progettista aggiunge una linea di associazione e una proprietà di chiave esterna.
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.
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.
Nella finestra di dialogo Proprietà connessione selezionare l'istanza locale di SQL Server Express e assegnare al database AlumniAssociationil nome .
Fare clic su Sì 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.
Viene creato un file .sql con i comandi DDL (Data Definition Language), ma i comandi non sono ancora stati eseguiti.
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 .
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.
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.
- Uso delle entità POCO. Questo è un documento MSDN che è una panoramica dei POCO, con collegamenti ad altri documenti con informazioni più dettagliate.
- Procedura dettagliata: Modello POCO per Entity Framework Questo è un post di blog del team di sviluppo di Entity Framework, con collegamenti ad altri post di blog sui poCO.
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:
- Sviluppo Code-First con Entity Framework 4. Questo è un post di blog di Scott Guthrie che introduce lo sviluppo code-first.
- Blog del team di sviluppo di Entity Framework - Post con tag CodeOnly
- Blog del team di sviluppo di Entity Framework - Post con tag Code First
- Esercitazione su MVC Music Store - Parte 4: Modelli e accesso ai dati
- Introduzione a MVC 3 - Parte 4: Sviluppo di Entity Framework Code-First
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:
- Novità di ADO.NET Argomento MSDN sulle nuove funzionalità della versione 4 di Entity Framework.
- Annuncio del rilascio di Entity Framework 4 Post di blog del team di sviluppo di Entity Framework sulle nuove funzionalità nella versione 4.