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
.
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à PersonID
Person
. 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.
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 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.
Verrà avviata la Creazione guidata modello di dati di entità. Nel passaggio Scegli contenuto modello selezionare Modello vuoto e quindi fare clic su Fine.
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.
Modificare il nome dell'entità da Entity1
a Alumnus
, modificare il nome AlumnusId
della 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
.
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.
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.
La finestra di progettazione aggiunge una linea di associazione e una proprietà di chiave esterna.
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.
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.
Nella finestra di dialogo Proprietà connessione selezionare l'istanza locale SQL Server Express e assegnare al database AlumniAssociation
il nome .
Fare clic su Sì 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.
Viene creato un file con estensione 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 è 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
.
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.
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:
- Utilizzo di entità POCO. Questo è un documento MSDN che fornisce 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 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:
- 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 contrassegnati con Code First
- Esercitazione su MVC Music Store - Parte 4: Modelli e accesso ai dati
- Introduzione con MVC 3 - Parte 4: Sviluppo di Entity Framework Code-First
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:
- Novità di ADO.NET Argomento MSDN sulle nuove funzionalità della versione 4 di Entity Framework.
- Annuncio del rilascio di Entity Framework 4 Il post di blog del team di sviluppo di Entity Framework sulle nuove funzionalità nella versione 4.