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
L'applicazione Web di esempio Contoso University illustra come creare applicazioni Web Forms ASP.NET usando Entity Framework 4.0 e Visual Studio 2010. Per informazioni sulla serie di esercitazioni, vedere la prima esercitazione della serie
Implementazione dell'ereditarietà tabella per gerarchia
Nell'esercitazione precedente sono stati usati i dati correlati aggiungendo ed eliminando relazioni e aggiungendo una nuova entità con una relazione a un'entità esistente. In questa esercitazione viene illustrato come implementare l'ereditarietà nel modello di dati.
Nella programmazione orientata agli oggetti è possibile usare l'ereditarietà per semplificare l'uso delle classi correlate. Ad esempio, è possibile creare Instructor classi e Student che derivano da una Person classe di base. È possibile creare gli stessi tipi di strutture di ereditarietà tra le entità in Entity Framework.
In questa parte dell'esercitazione non verranno create nuove pagine Web. Si aggiungeranno invece entità derivate al modello di dati e si modificheranno le pagine esistenti per usare le nuove entità.
Ereditarietà tabella per gerarchia e tabella per tipo
Un database può archiviare informazioni sugli oggetti correlati in una tabella o in più tabelle. Ad esempio, nel School database la Person tabella include informazioni su studenti e insegnanti in una singola tabella. Alcune colonne si applicano solo agli insegnanti (HireDate), alcuni solo agli studenti (EnrollmentDate) e alcuni a entrambi (LastName, FirstName).
È possibile configurare Entity Framework per creare Instructor e Student entità che ereditano dall'entità Person . Questo modello di generazione di una struttura di ereditarietà delle entità da una singola tabella di database è detta ereditarietà di tabella per gerarchia (TPH).
Per i corsi, il School database usa un modello diverso. I corsi online e i corsi in loco sono archiviati in tabelle separate, ognuna delle quali ha una chiave esterna che punta alla Course tabella. Le informazioni comuni a entrambi i tipi di corso vengono archiviate solo nella Course tabella.
È possibile configurare il modello di dati di Entity Framework in modo che OnlineCourse e OnsiteCourse le entità ereditino dall'entità Course . Questo modello di generazione di una struttura di ereditarietà di entità da tabelle separate per ogni tipo, con ogni tabella separata che fa riferimento a una tabella che archivia i dati comuni a tutti i tipi, viene chiamata ereditarietà di tabella per tipo (TPT).
I modelli di ereditarietà TPH offrono in genere prestazioni migliori in Entity Framework rispetto ai modelli di ereditarietà TPT, perché i modelli TPT possono comportare query di join complesse. Questa procedura dettagliata illustra come implementare l'ereditarietà TPH. A tale scopo, seguire questa procedura:
- Creare
Instructortipi di entità eStudentche derivano daPerson. - Spostare le proprietà relative alle entità derivate dall'entità
Personalle entità derivate. - Impostare vincoli sulle proprietà nei tipi derivati.
- Rendere l'entità un'entità
Personastratta. - Eseguire il mapping di ogni entità derivata alla
Persontabella con una condizione che specifica come determinare se unaPersonriga rappresenta il tipo derivato.
Aggiunta di entità instructor e student
Aprire il file SchoolModel.edmx , fare clic con il pulsante destro del mouse su un'area non interessata nella finestra di progettazione, scegliere Aggiungi e quindi selezionare Entità.
Nella finestra di dialogo Aggiungi entità assegnare all'entità Instructor il nome e impostare l'opzione Tipo di base su Person.
Fare clic su OK. La finestra di progettazione crea un'entità Instructor che deriva dall'entità Person . La nuova entità non dispone ancora di proprietà.
Ripetere la procedura per creare un'entità Student che deriva anche da Person.
Solo gli istruttori hanno date di assunzione, quindi è necessario spostare tale proprietà dall'entità Person all'entità Instructor . Nell'entità Person fare clic con il pulsante destro del mouse sulla HireDate proprietà e scegliere Taglia. Fare quindi clic con il pulsante destro del mouse su Proprietà nell'entità Instructor e scegliere Incolla.
La data di assunzione di un'entità Instructor non può essere Null. Fare clic con il pulsante destro del mouse sulla HireDate proprietà, scegliere Proprietà, quindi nella finestra Proprietà passareNullable a False.
Ripetere la procedura per spostare la EnrollmentDate proprietà dall'entità Person all'entità Student . Assicurarsi di impostare anche su NullableFalse per la EnrollmentDate proprietà .
Ora che un'entità Person ha solo le proprietà comuni a Instructor e Student le entità (a parte le proprietà di navigazione, che non si spostano), l'entità può essere usata solo come entità di base nella struttura di ereditarietà. Pertanto, è necessario assicurarsi che non venga mai trattato come entità indipendente. Fare clic con il pulsante destro del mouse sull'entità Person , selezionare Proprietà e quindi nella finestra Proprietà modificare il valore della proprietà Abstract su True.
Mapping di entità instructor e student alla tabella Person
È ora necessario indicare a Entity Framework come distinguere tra Instructor le entità e Student nel database.
Fare clic con il pulsante destro del mouse sull'entità Instructor e scegliere Mapping tabelle. Nella finestra Dettagli mapping fare clic su Aggiungi tabella o vista e selezionare Persona.
Fare clic su Aggiungi una condizione e quindi selezionare HireDate.
Impostare Operatore su Is e Value/Property su Not Null.
Ripetere la procedura per l'entità Students specificando che questa entità esegue il Person mapping alla tabella quando la EnrollmentDate colonna non è Null. Salvare e chiudere il modello di dati.
Compilare il progetto per creare le nuove entità come classi e renderle disponibili nella finestra di progettazione.
Uso delle entità Instructor e Student
Quando sono state create le pagine Web che funzionano con i dati degli studenti e dell'insegnante, i dati sono stati inseriti nel Person set di entità e sono stati filtrati in HireDate base alla proprietà o EnrollmentDate per limitare i dati restituiti agli studenti o agli insegnanti. Tuttavia, ora, quando si associa ogni controllo origine dati al Person set di entità, è possibile specificare che devono essere selezionati solo Student i tipi di entità o Instructor . Poiché Entity Framework sa distinguere gli studenti e gli insegnanti nel Person set di entità, è possibile rimuovere le impostazioni delle Where proprietà immesse manualmente per eseguire questa operazione.
Nella Designer di Visual Studio è possibile specificare il tipo di entità che un EntityDataSource controllo deve selezionare nella casella di riepilogo a discesa EntityTypeFilter della Configure Data Source procedura guidata, come illustrato nell'esempio seguente.
E nella finestra Proprietà è possibile rimuovere Where i valori delle clausole che non sono più necessari, come illustrato nell'esempio seguente.
Tuttavia, poiché il markup per i controlli è stato modificato per EntityDataSource l'uso dell'attributo ContextTypeName , non è possibile eseguire la procedura guidata Configura origine dati nei EntityDataSource controlli già creati. Di conseguenza, le modifiche necessarie verranno apportate modificando invece il markup.
Aprire la pagina Students.aspx .
StudentsEntityDataSource Nel controllo rimuovere l'attributo Where e aggiungere un EntityTypeFilter="Student" attributo. Il markup sarà ora simile all'esempio seguente:
<asp:EntityDataSource ID="StudentsEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False"
EntitySetName="People" EntityTypeFilter="Student"
Include="StudentGrades"
EnableDelete="True" EnableUpdate="True"
OrderBy="it.LastName" >
</asp:EntityDataSource>
L'impostazione dell'attributo EntityTypeFilter garantisce che il EntityDataSource controllo selezioni solo il tipo di entità specificato. Se si desidera recuperare entrambi i Student tipi di entità e Instructor , non impostare questo attributo. È possibile recuperare più tipi di entità con un EntityDataSource controllo solo se si usa il controllo per l'accesso ai dati di sola lettura. Se si usa un EntityDataSource controllo per inserire, aggiornare o eliminare entità e se il set di entità a cui è associato può contenere più tipi, è possibile usare un solo tipo di entità ed è necessario impostare questo attributo.
Ripetere la procedura per il SearchEntityDataSource controllo, ad eccezione di rimuovere solo la parte dell'attributo Where che seleziona le entità anziché rimuovere completamente Student la proprietà. Il tag di apertura del controllo sarà ora simile all'esempio seguente:
<asp:EntityDataSource ID="SearchEntityDataSource" runat="server"
ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False"
EntitySetName="People" EntityTypeFilter="Student"
Where="it.FirstMidName Like '%' + @StudentName + '%' or it.LastName Like '%' + @StudentName + '%'" >
Eseguire la pagina per verificare che funzioni ancora come in precedenza.
Aggiornare le pagine seguenti create nelle esercitazioni precedenti in modo che usino le nuove Student entità e Instructor anziché Person le entità, quindi eseguirle per verificare che funzionino come in precedenza:
In StudentsAdd.aspx aggiungere
EntityTypeFilter="Student"alStudentsEntityDataSourcecontrollo . Il markup sarà ora simile all'esempio seguente:<asp:EntityDataSource ID="StudentsEntityDataSource" runat="server" ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False" EntitySetName="People" EntityTypeFilter="Student" EnableInsert="True" </asp:EntityDataSource>In About.aspx aggiungere
EntityTypeFilter="Student"alStudentStatisticsEntityDataSourcecontrollo e rimuovereWhere="it.EnrollmentDate is not null". Il markup sarà ora simile all'esempio seguente:<asp:EntityDataSource ID="StudentStatisticsEntityDataSource" runat="server" ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False" EntitySetName="People" EntityTypeFilter="Student" Select="it.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents" OrderBy="it.EnrollmentDate" GroupBy="it.EnrollmentDate" > </asp:EntityDataSource>In Instructors.aspx e InstructorsCourses.aspx aggiungere
EntityTypeFilter="Instructor"alInstructorsEntityDataSourcecontrollo e rimuovereWhere="it.HireDate is not null". Il markup in Instructors.aspx è ora simile all'esempio seguente:<asp:EntityDataSource ID="InstructorsEntityDataSource" runat="server" ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="false" EntitySetName="People" EntityTypeFilter="Instructor" Include="OfficeAssignment" EnableUpdate="True"> </asp:EntityDataSource>Il markup in InstructorsCourses.aspx sarà ora simile all'esempio seguente:
<asp:EntityDataSource ID="InstructorsEntityDataSource" runat="server" ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False" EntitySetName="People" EntityTypeFilter="Instructor" Select="it.LastName + ',' + it.FirstMidName AS Name, it.PersonID"> </asp:EntityDataSource>
In seguito a queste modifiche, è stata migliorata la manutenibilità dell'applicazione Contoso University in diversi modi. La logica di selezione e convalida è stata spostata al di fuori del livello dell'interfaccia utente (markup aspx ) e si è resa parte integrante del livello di accesso ai dati. Ciò consente di isolare il codice dell'applicazione dalle modifiche che potrebbero essere apportate in futuro allo schema del database o al modello di dati. Ad esempio, si potrebbe decidere che gli studenti potrebbero essere assunti come aiuti degli insegnanti e quindi ottenere una data di assunzione. È quindi possibile aggiungere una nuova proprietà per distinguere gli studenti dagli insegnanti e aggiornare il modello di dati. Nell'applicazione Web non è necessario modificare codice, ad eccezione del punto in cui si desidera visualizzare una data di assunzione per gli studenti. Un altro vantaggio dell'aggiunta Instructor e Student delle entità è che il codice è più comprensibile rispetto a quando si fa riferimento a Person oggetti effettivamente studenti o insegnanti.
È stato ora illustrato un modo per implementare un modello di ereditarietà in Entity Framework. Nell'esercitazione seguente si apprenderà come usare le stored procedure per avere un maggiore controllo sul modo in cui Entity Framework accede al database.