Condividi tramite


Procedura dettagliata: eseguire il mapping dell'ereditarietà (tabella per tipo)

In questo argomento viene illustrato come implementare l'ereditarietà tabella per tipo modificando il modello concettuale in un modello EDM (Entity Data Model). L'ereditarietà tabella per tipo prevede l'utilizzo di una tabella separata nel database per la gestione dei dati relativi alle proprietà non ereditate e alle proprietà chiave di ogni tipo della gerarchia di ereditarietà. Per ulteriori informazioni sull'implementazione dell'ereditarietà con un modello EDM, vedere Ereditarietà (EDM).

In questa procedura dettagliata verrà implementata l'ereditarietà tabella per tipo modificando il modello EDM (Entity Data Model) utilizzato nell'applicazione CourseManager. Per ulteriori informazioni, vedere la sezione Prerequisiti più avanti in questo argomento.

Nell'applicazione CourseManager viene eseguito il mapping dei tipi di entità Course, OnlineCourse e OnsiteCourse a tabelle con gli stessi nomi. Poiché i tipi di entità OnlineCourse e OnsiteCourse contengono informazioni specifiche per i due tipi di corso e condividono una chiave comune, possono essere modificati per ereditare dal tipo di entità Course. Nei passaggi seguenti viene riepilogata l'implementazione dell'ereditarietà tabella per tipo in questo caso. Le procedure dettagliate sono descritte più avanti nel presente argomento.

  1. Eliminare l'associazione tra i tipi di entità OnlineCourse e Course. Eliminare l'associazione tra i tipi di entità OnsiteCourse e Course. Queste associazioni verranno sostituite mediante l'implementazione della gerarchia di ereditarietà.

  2. Eliminare la proprietà chiave CourseID dai tipi di entità OnlineCourse e OnsiteCourse. Questa proprietà verrà ereditata dal tipo di entità Course.

  3. Impostare il tipo di entità Course come tipo di base per i tipi di entità OnlineCourse e OnsiteCourse.

  4. Convertire il tipo di entità Course in un tipo astratto.

  5. Eseguire il mapping delle proprietà CourseID ereditate dei tipi di entità OnlineCourse e OnsiteCourse alle colonne appropriate.

Prerequisiti

Per completare questa procedura dettagliata, è necessario innanzitutto compilare l'applicazione CourseManager. Per ulteriori informazioni e istruzioni, vedere la Guida rapida di Entity Framework. Verrà modificato il modello EDM utilizzato nell'applicazione CourseManager implementando l'ereditarietà tabella per tipo. Quindi, verrà estesa la funzionalità dell'applicazione per visualizzare separatamente i corsi in linea e i corsi in sede per un reparto selezionato.

NoteNota

Poiché in molte delle procedure guidate descritte in questa documentazione l'applicazione CourseManager rappresenta il punto di partenza, è consigliabile utilizzarne una copia anziché modificarne il codice originale.

In questa procedura dettagliata si presuppone che il lettore disponga di una conoscenza di base di Visual Studio, .NET Framework e della programmazione in Visual C# o Visual Basic.

Implementazione dell'ereditarietà tabella per tipo

In questa procedura verrà modificata la parte concettuale del modello EDM SchoolModel per implementare l'ereditarietà tabella per tipo.

Per implementare l'ereditarietà tabella per tipo

  1. Aprire la soluzione CourseManager in Visual Studio.

  2. In Esplora soluzioni fare doppio clic sul file School.edmx.

    Il file School.edmx verrà aperto in Entity Data Model Designer (Entity Designer).

  3. Fare clic con il pulsante destro del mouse sul tipo di entità OnlineCourse e scegliere Proprietà.

  4. Nella finestra Proprietà impostare la proprietà Base Type su Course.

  5. Ripetere i passaggi 3 e 4 per il tipo di entità OnsiteCourse.

  6. Fare clic con il pulsante destro del mouse sull'associazione, ovvero la linea, tra i tipi di entità OnlineCourse e Course. Scegliere Elimina.

  7. Fare clic con il pulsante destro del mouse sull'associazione tra i tipi di entità OnsiteCourse e Course. Scegliere Elimina.

  8. Fare clic con il pulsante destro del mouse sulla proprietà CourseID del tipo di entità OnlineCourse, quindi scegliere Elimina.

  9. Fare clic con il pulsante destro del mouse sulla proprietà CourseID del tipo di entità OnsiteCourse, quindi scegliere Elimina.

  10. Selezionare il tipo di entità Course. Impostare la relativa proprietà Abstract su true nella finestra Proprietà.

    Verrà visualizzata una finestra di messaggio in cui viene indicato che la definizione di un tipo di entità come astratto determinerà la rimozione di tutti i mapping di funzione esistenti per tale tipo. Fare clic su OK.

    NoteNota

    Poiché il tipo di entità Course risulta ora modificato in un tipo astratto, la funzionalità di aggiornamento dell'applicazione CourseManager originale non funzionerà.

  11. Fare clic con il pulsante destro del mouse sul tipo di entità OnlineCourse e scegliere Mapping tabella.

    Verrà visualizzata la finestra Dettagli Mapping.

  12. Fare clic sul campo Valore/Proprietà che corrisponde alla colonna CourseID.

    Il campo Valore/Proprietà diventa un elenco a discesa contenente le proprietà di cui è possibile eseguire il mapping alla colonna corrispondente.

  13. Selezionare CourseID nell'elenco a discesa.

  14. Ripetere i passaggi da 11 a 13 per il tipo di entità OnsiteCourse.

A questo punto l'ereditarietà tabella per tipo risulta implementata.

Costruzione dell'interfaccia utente

A questo punto verrà aggiunto un pulsante al form CourseViewer che carica e visualizza il form CourseDiscrimForm. Quindi, verranno aggiunti due controlli DataGridView per la visualizzazione di OnsiteCourses e OnlineCourses. Infine, DataGridView verrà associato ai controlli BindingSource. Per ulteriori informazioni sull'associazione di oggetti ai controlli, vedere Associazione di oggetti ai controlli (Entity Framework).

Per costruire l'interfaccia utente

  1. Fare clic con il pulsante destro del mouse sul progetto CourseManager in Esplora soluzioni, scegliere Aggiungi, quindi fare clic su Nuovo elemento.

    Verrà visualizzata la finestra di dialogo Aggiungi nuovo elemento.

  2. Selezionare Windows Form e fare clic su Aggiungi.

    Un nuovo form verrà aggiunto al progetto e aperto nella finestra di progettazione dei form.

  3. Nella finestra Proprietà impostare il nome del form su CourseDiscriminator.

    Un nuovo form verrà aggiunto al progetto e aperto nella finestra di progettazione dei form. Il nome del form viene impostato su CourseDiscriminator, mentre il testo viene impostato su CourseDiscriminator.

  4. Trascinare un controllo ComboBox dalla casella degli strumenti al form e impostarne il nome su departmentList nella finestra Proprietà.

  5. Trascinare un controllo DataGridView dalla casella degli strumenti nel form e impostarne il nome su onsiteGridView.

  6. Trascinare un altro controllo DataGridView dalla casella degli strumenti nel form e impostarne il nome su onlineGridView.

  7. In Esplora soluzioni fare doppio clic su CourseViewer.cs o su CourseViewer.vb.

    Verrà aperta la visualizzazione Progettazione del form CourseViewer.

  8. Trascinare un controllo Button dalla casella degli strumenti nel form CourseViewer.

  9. Nella finestra Proprietà impostare il nome del pulsante Button su viewDiscriminator e impostare il testo del pulsante su Online vs. Onsite.

  10. Fare doppio clic su viewDiscriminatorButton.

    Verrà aperto il file code-behind per il form.

  11. Aggiungere il codice seguente al gestore eventi viewDiscriminator_click:

    Dim courseDiscrim As New CourseDiscriminator
    courseDiscrim.Visible = True
    
    CourseDiscriminator courseDiscrim = new CourseDiscriminator();
    courseDiscrim.Visible = true;
    

L'interfaccia utente del form è ora completa.

Esecuzione di query sul modello EDM

In questa procedura verrà eseguita una query sul modello EDM e verranno associati i risultati ai controlli Windows Form.

Per eseguire query sul modello EDM

  1. Aprire il form CourseDiscriminator nella finestra di progettazione dei form.

  2. Trascinare un controllo BindingSource dalla casella degli strumenti nel form.

  3. Nella finestra Proprietà impostare il nome del form BindingSource su onsiteBindingSource.

  4. Fare clic sul campo accanto alla proprietà DataSource nella finestra Proprietà.

    Il campo diventerà un elenco a discesa delle origini dati disponibili.

  5. Fare clic su Aggiungi origine dati progetto.

    Verrà visualizzata la finestra Seleziona un tipo di origine dati della Configurazione guidata origine dati.

  6. Nella casella Specificare il percorso dei dati per l'applicazione selezionare Oggetto.

  7. Fare clic su Avanti.

    Verrà visualizzata la finestra Seleziona l'oggetto da associare. Verrà visualizzato il nodo di livello superiore di una struttura ad albero di risorse disponibili.

  8. Espandere il nodo CourseManager, quindi espandere il nodo SchoolModel (C#) o CourseManager.SchoolModel (Visual Basic).

  9. Selezionare OnsiteCourse e fare clic su Fine.

  10. Ripetere i passaggi da 2 a 9, ma assegnare al controllo BindingSource il nome OnlineBindingSource e associarlo all'oggetto OnlineCourse.

  11. Fare clic con il pulsante destro del mouse sul controllo OnsiteGridView e scegliere Proprietà.

  12. Fare clic sul campo accanto alla proprietà DataSource nella finestra Proprietà.

    Il campo diventerà un elenco a discesa delle origini dati disponibili.

  13. Selezionare OnsiteBindingSource.

  14. Ripetere i passaggi da 11 a 13 per OnlineGridView, ma impostare la proprietà DataSouce su OnlineBindingSource.

    NoteNota

    Il metodo OfType restituisce un'enumerazione dalla quale un controllo DataGridView non può generare colonne in fase di esecuzione. Per visualizzare le informazioni desiderate dell'esempio, le origini dati dei controlli DataGridView vengono impostate in fase di progettazione tramite i controlli BindingSource, in base alle classi con cui si intende eseguire l'associazione.

  15. Fare doppio clic sul form CourseDiscriminator.

    Verrà aperto il file code-behind per il form CourseDiscriminator.

  16. Aggiungere le istruzioni using (C#) o Imports (Visual Basic) seguenti per fare riferimento al modello creato dal database School e allo spazio dei nomi dell'entità.

    Imports System.Data.Objects
    Imports System.Data.Objects.DataClasses
    
    using System.Data.Objects;
    using System.Data.Objects.DataClasses;
    
  17. Aggiungere una proprietà che rappresenta il contesto dei dati alla classe CourseDiscriminator:

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities
    
    // Create an ObjectContext instance based on SchoolEntity.
    private SchoolEntities schoolContext;
    
  18. Nel gestore eventi CourseDiscriminator_Load aggiungere codice per inizializzare il contesto dell'oggetto e associare il controllo departmentList a una query che restituisce informazioni su Department.

    ' Initialize the ObjectContext.
    schoolContext = New SchoolEntities()
    
    ' Define a query that returns all Department objects and 
    ' related Course objects, ordered by name.
    Dim departmentQuery As ObjectQuery(Of Department) = _
            schoolContext.Department.Include("Course") _
            .OrderBy("it.Name")
    
    ' Bind the ComboBox control to the query, which is
    ' executed during data binding.
    departmentList.DataSource = departmentQuery _
    .Execute(MergeOption.OverwriteChanges)
    departmentList.DisplayMember = "Name"
    
        // Initialize the ObjectContext.
        schoolContext = new SchoolEntities();
    
        // Define a query that returns all Department objects  
        // and related Course objects, ordered by name.
        ObjectQuery<Department> departmentQuery =
            schoolContext.Department.Include("Course")
            .OrderBy("it.Name");
    
        // Bind the ComboBox control to the query, which is
        // executed during data binding.
        this.departmentList.DataSource = departmentQuery
    .Execute(MergeOption.OverwriteChanges);
        this.departmentList.DisplayMember = "Name";
    
  19. Tornare alla visualizzazione Progettazione del form CourseDiscriminator e fare doppio clic sul controllo departmentListComboBox.

    Verrà aperto il file code-behind. Al codice è stato aggiunto un gestore eventi departmentList_SelectedIndexChanged.

  20. Aggiungere il codice seguente al gestore eventi departmentList_SelectedIndexChanged per aggiornare le origini dati dei controlli BindingSource.

    ' Get the selected department object.
    Dim department As Department = CType(Me.departmentList. _
            SelectedItem, Department)
    
    ' Update the data sources for the BindingSource controls.
    onsiteBindingSource.DataSource = department.Course _
        .OfType(Of OnsiteCourse)()
    onlineBindingSource.DataSource = department.Course _
        .OfType(Of OnlineCourse)()
    
    // Get the selected department object.
    Department department = (Department)this.departmentList
        .SelectedItem;
    
    // Update the data sources for the BindingSource controls.
    onsiteBindingSource.DataSource = department.Course
        .OfType<OnsiteCourse>();
    onlineBindingSource.DataSource = department.Course
        .OfType<OnlineCourse>();
    

L'applicazione è ora completa. Premere CTRL+F5 per eseguirla. Fare clic sul pulsante Onsite vs. Online per caricare il form CourseDiscriminator. Verranno visualizzati OnsiteCourses e OnlineCourses per il reparto selezionato nei controlli DataGridView.

Listato di codice

In questa sezione viene riportata la versione finale del file code-behind del form CourseDiscriminator.

Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Public Class CourseDiscriminator

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities

    Private Sub CourseDiscriminator_Load(ByVal sender As System. _
        Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Initialize the ObjectContext.
        schoolContext = New SchoolEntities()

        ' Define a query that returns all Department objects and 
        ' related Course objects, ordered by name.
        Dim departmentQuery As ObjectQuery(Of Department) = _
                schoolContext.Department.Include("Course") _
                .OrderBy("it.Name")

        ' Bind the ComboBox control to the query, which is
        ' executed during data binding.
        departmentList.DataSource = departmentQuery _
        .Execute(MergeOption.OverwriteChanges)
        departmentList.DisplayMember = "Name"
    End Sub

    Private Sub departmentList_SelectedIndexChanged(ByVal sender As  _
        System.Object, ByVal e As System.EventArgs) Handles _
        departmentList.SelectedIndexChanged
        ' Get the selected department object.
        Dim department As Department = CType(Me.departmentList. _
                SelectedItem, Department)

        ' Update the data sources for the BindingSource controls.
        onsiteBindingSource.DataSource = department.Course _
            .OfType(Of OnsiteCourse)()
        onlineBindingSource.DataSource = department.Course _
            .OfType(Of OnlineCourse)()
    End Sub
End Class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Objects;
using System.Data.Objects.DataClasses;

namespace CourseManager
{
    public partial class CourseDiscriminator : Form
    {
        // Create an ObjectContext instance based on SchoolEntity.
        private SchoolEntities schoolContext;

        public CourseDiscriminator()
        {
            InitializeComponent();
        }

        private void CourseDiscriminator_Load(object sender, 
            EventArgs e)
        {
            // Initialize the ObjectContext.
            schoolContext = new SchoolEntities();

            // Define a query that returns all Department objects  
            // and related Course objects, ordered by name.
            ObjectQuery<Department> departmentQuery =
                schoolContext.Department.Include("Course")
                .OrderBy("it.Name");

            // Bind the ComboBox control to the query, which is
            // executed during data binding.
            this.departmentList.DataSource = departmentQuery
        .Execute(MergeOption.OverwriteChanges);
            this.departmentList.DisplayMember = "Name";
        }

        private void departmentList_SelectedIndexChanged(object sender, 
            EventArgs e)
        {
            // Get the selected department object.
            Department department = (Department)this.departmentList
                .SelectedItem;

            // Update the data sources for the BindingSource controls.
            onsiteBindingSource.DataSource = department.Course
                .OfType<OnsiteCourse>();
            onlineBindingSource.DataSource = department.Course
                .OfType<OnlineCourse>();
        }
    }
}

Passaggi successivi

È stata implementata l'ereditarietà tabella per tipo in un modello EDM. Per ulteriori informazioni sulla definizione di un modello EDM con ereditarietà tabella per tipo, vedere Procedura: definire un modello con ereditarietà tabella per tipo (Entity Framework). Per ulteriori informazioni sulla compilazione delle applicazioni che utilizzano Entity Framework, vedere Guida per programmatori (Entity Framework).

Vedere anche

Altre risorse

Scenari di ADO.NET Entity Data Model Designer
Attività degli strumenti di Entity Data Model