Share via


Procedura dettagliata: mapping di un'entità a più tabelle (strumenti di Entity Data Model)

In questo argomento viene illustrato come eseguire il mapping di un tipo di entità a due tabelle modificando il modello concettuale in un modello concettuale. È possibile eseguire il mapping di un'entità a più tabelle quando le tabelle in questione condividono una chiave comune. I concetti relativi all'esecuzione del mapping di un tipo di entità a due tabelle possono essere facilmente estesi anche all'esecuzione del mapping a più di due tabelle.

In questa procedura dettagliata verrà eseguito il mapping di un tipo di entità a due tabelle modificando il modello concettuale utilizzato nell'applicazione CourseManager. Per ulteriori informazioni, vedere la sezione Prerequisiti più avanti in questo argomento. Verrà creato un nuovo tipo di entità (Instructor, derivato dal tipo di entità Person , e ne verrà eseguito il mapping alle tabelle Person e OfficeAssignment. L'intero processo viene riepilogato nei passaggi riportati di seguito. Le procedure dettagliate sono descritte più avanti nel presente documento.

  1. Creare un tipo di entità, Instructor.

  2. Impostare il tipo di base per Instructor su Person.

    Cc716698.note(it-it,VS.100).gifNota:
    Non è necessario creare una gerarchia di ereditarietà per eseguire il mapping di un tipo di entità a più tabelle.In questo esempio viene utilizzata solo per ottenere un effetto più realistico. In una scuola, infatti, solo un docente può avere l'assegnazione di un ufficio.Sarebbe possibile eseguire il mapping del tipo di entità Person a entrambe le tabelle Person e OfficeAssignment senza creare un tipo di entità Instructor.

  3. Spostare la proprietà HireDate da Person a Instructor.

  4. Spostare le proprietà Location e Timestamp da OfficeAssignment a Instructor.

  5. Eseguire il mapping dell'entità Instructor alla tabella Person con la condizione HireDate Is Not Null. Eseguire il mapping della colonna HireDate alla proprietà HireDate.

  6. Eseguire il mapping dell'entità Instructor alla tabella OfficeAssignment senza una condizione. Eseguire il mapping della colonna InstructorID alla proprietà PersonID e della colonna Location alla proprietà Location.

  7. Eliminare il tipo di entità OfficeAssignment.

Prerequisiti

Per completare questa procedura dettagliata, è necessario innanzitutto compilare l'applicazione CourseManager. Per ulteriori informazioni, vedere la Guida rapida di Entity Framework. Il modello concettuale utilizzato nell'applicazione CourseManager verrà modificato aggiungendo un nuovo tipo di entità ed eseguendone il mapping a due tabelle. La funzionalità dell'applicazione verrà quindi estesa per visualizzare le assegnazioni degli uffici dei docenti.

Cc716698.note(it-it,VS.100).gifNota:
Dal momento che in molti argomenti contenenti procedure dettagliate di questa documentazione viene utilizzata l'applicazione CourseManager come punto di partenza, è consigliabile utilizzare una copia di tale applicazione 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.

Mapping di un'entità a due tabelle

In questa procedura il contenuto del mapping e CSDL del file School.edmx verrà modificato attraverso la creazione di un nuovo tipo di entità (Instructor) e l'esecuzione del mapping dello stesso a due tabelle, Person e OfficeAssignment.

Per eseguire il mapping di un'entità a due tabelle

  1. Aprire la soluzione CourseManager in Visual Studio.

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

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

  3. Fare clic con il pulsante destro del mouse in un punto vuoto dell'area di Entity Designer, scegliere Aggiungi, quindi fare clic su Entità.

    Verrà visualizzata la finestra di dialogo Nuova Entity.

  4. Digitare Instructor per Nome entità e selezionare Person dall'elenco a discesa per il Tipo di base.

  5. Scegliere OK.

    Nell'area di progettazione verrà creato e visualizzato un nuovo tipo di entità.

  6. Fare clic con il pulsante destro del mouse sulla proprietà HireDate (in Proprietà scalari) del tipo di entità Person e scegliere Taglia.

  7. Fare clic con il pulsante destro del mouse su Proprietà scalari del tipo di entità Instructor e scegliere Incolla.

  8. Fare clic con il pulsante destro del mouse sulla proprietà HireDate e scegliere Proprietà.

    Verrà visualizzata la finestra Proprietà.

  9. Nella finestra Proprietà impostare la proprietà Nullable su false.

  10. Fare clic con il pulsante destro del mouse sulla proprietà Location del tipo di entità OfficeAssignment e scegliere Taglia.

  11. Fare clic con il pulsante destro del mouse su Proprietà scalari del tipo di entità Instructor e scegliere Incolla.

  12. Fare clic con il pulsante destro del mouse sulla proprietà Location e scegliere Proprietà.

  13. Nella finestra Proprietà impostare la proprietà Nullable su false.

  14. Ripetere passaggi da 10 a 13 per la proprietà Timestamp del tipo OfficeAssignment.

    Cc716698.note(it-it,VS.100).gifNota:
    I passaggi successivi presuppongono che la finestra Dettagli Mapping sia aperta.Se la finestra non è visibile, fare clic con il pulsante destro del mouse sull'area di progettazione e scegliere Dettagli Mapping.

  15. Selezionare il tipo di entità Instructor e fare clic su <Aggiungi tabella o visualizzazione> nella finestra Dettagli Mapping.

    Il campo <Aggiungi tabella o visualizzazione> diventa un elenco a discesa di tabelle o visualizzazioni a cui è possibile eseguire il mapping dell'entità selezionata.

  16. Selezionare Person dall'elenco a discesa.

    La finestra Dettagli Mapping viene aggiornata con i mapping di colonne predefiniti e con un'opzione per l'aggiunta di una condizione.

  17. Fare clic su <Aggiungere una Condition>.

    Il campo <Aggiungere una Condition> diventa un elenco a discesa di colonne in cui è possibile impostare le condizioni.

  18. Selezionare HireDate dall'elenco a discesa.

  19. Nella colonna Operatore della finestra Dettagli Mapping selezionare Is dall'elenco a discesa.

  20. Nella colonna Proprietà/Valore della finestra Dettagli Mapping selezionare Not Null.

  21. Fare clic su <Aggiungi tabella o visualizzazione> e selezionare OfficeAssignment dall'elenco a discesa.

    La finestra Dettagli Mapping viene aggiornata con i mapping di colonne predefiniti.

  22. Fare clic nel campo Proprietà/Valore che corrisponde alla colonna InstructorID e selezionare PersonID dall'elenco a discesa.

  23. Fare clic con il pulsante destro del mouse sul tipo di entità OfficeAssignment e scegliere Elimina.

Il tipo di entità Instructor è ora mappato alle tabelle Person e OfficeAssignment.

Costruzione dell'interfaccia utente

A questo punto verrà aggiunto un pulsante al form CourseViewer che carica e visualizza il form CourseAssignmentForm. Quindi, verrà aggiunto un controllo DataGridView al form per la visualizzazione delle ubicazioni degli uffici di Instructor. Infine, verrà aggiunto un pulsante a CourseAssignmentForm in modo da salvare gli aggiornamenti nel database.

Per costruire l'interfaccia utente

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

    Verrà visualizzata la finestra di dialogo Aggiungi nuovo elemento.

  2. Selezionare Windows Form, impostare il nome del form su OfficeAssignment.vb o OfficeAssignment.cs e fare clic su Aggiungi.

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

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

  4. Fare clic sullo smart tag di DataGridView e deselezionare Attiva aggiunta e le opzioni di Attiva eliminazione.

  5. Trascinare un controllo Button nel form e impostarne la proprietà del nome su saveChanges e la proprietà del testo su Update.

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

    Verrà aperta la visualizzazione Progettazione del form CourseViewer.

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

  8. Nella finestra Proprietà impostare il nome del pulsante su viewOffices e impostare il testo del pulsante su View Offices.

  9. Fare doppio clic su viewOffices Button.

    Verrà visualizzato il file code-behind per CourseViewer.

  10. Aggiungere il codice seguente al gestore eventi viewOffices_click:

    Dim officeForm As New OfficeAssignment()
    officeForm.Visible = True
    
    OfficeAssignment officeForm = new OfficeAssignment();
    officeForm.Visible = true;
    

L'interfaccia utente del form è ora completa.

Esecuzione di query sul modello concettuale

In questa applicazione i dati vengono visualizzati associando un controllo DataGridView a una query. Le informazioni visualizzate nel controllo DataGridView possono essere modificate e le modifiche possono essere salvate nel database. Per ulteriori informazioni sull'associazione di oggetti ai controlli, vedere Binding Objects to Controls (Entity Framework).

Per eseguire query sul modello concettuale

  1. Fare doppio clic sul corpo del form OfficeAssignment dopo averlo aperto nella finestra di progettazione dei form.

    Verrà visualizzato il file code-behind per il form OfficeAssignment.

  2. 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;
    
  3. Aggiungere una proprietà che rappresenta il contesto dei dati alla classe OfficeAssignment:

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

    ' Initialize the ObjectContext.
    schoolContext = New SchoolEntities()
    
    ' Get Persons of type Instructor.
    Dim instructorQuery As ObjectQuery(Of Instructor) = _
        schoolContext.People.OfType(Of Instructor)()
    
    ' Bind the query results to the GridView control.
    ' Display only location and name.
    officeGridView.DataSource = instructorQuery _
        .Execute(MergeOption.OverwriteChanges)
    officeGridView.Columns("HireDate").Visible = False
    officeGridView.Columns("PersonID").Visible = False
    officeGridView.Columns("Timestamp").Visible = False
    officeGridView.Columns("EnrollmentDate").Visible = False
    officeGridView.Columns("StudentGrades").Visible = False
    officeGridView.Columns("Courses").Visible = False
    
    schoolContext = new SchoolEntities();
    
    // Get Persons of type Instructor.
    ObjectQuery<Instructor> instructorQuery = schoolContext
        .People.OfType<Instructor>();
    
    // Bind the query results to the GridView control.
    // Display only location and name.
    officeGridView.DataSource = instructorQuery
        .Execute(MergeOption.OverwriteChanges);
    officeGridView.Columns["HireDate"].Visible = false;
    officeGridView.Columns["Timestamp"].Visible = false;
    officeGridView.Columns["PersonID"].Visible = false;
    officeGridView.Columns["EnrollmentDate"].Visible = false;
    officeGridView.Columns["StudentGrades"].Visible = false;
    officeGridView.Columns["Courses"].Visible = false;
    
  5. Tornare alla visualizzazione Progettazione del form OfficeAssignment e fare doppio clic sul controllo saveChanges Button.

    Il gestore eventi saveChanges_Click viene creato nel file code-behind.

  6. Aggiungere codice al gestore eventi per salvare le eventuali modifiche apportate al database nel controllo DataGridView.

    ' Save object changes to the database, 
    ' display a message, and refresh the form.
    schoolContext.SaveChanges()
    MessageBox.Show("Change(s) saved to the database.")
    Me.Refresh()
    
    // Save object changes to the database, 
    // display a message, and refresh the form.
    schoolContext.SaveChanges();
    MessageBox.Show("Change(s) saved to the database.");
    this.Refresh();
    

L'applicazione è ora completa. Premere Ctrl+F5 per eseguirla. Fare clic sul pulsante View Offices per caricare il form OfficeAssignments. I nomi dei docenti e le ubicazioni degli uffici sono ora visualizzati. È possibile modificare le informazioni visualizzate e salvare le modifiche nel database facendo clic sul pulsante Update.

Listato di codice

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

Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Public Class OfficeAssignment
    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities

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

        ' Get Persons of type Instructor.
        Dim instructorQuery As ObjectQuery(Of Instructor) = _
            schoolContext.People.OfType(Of Instructor)()

        ' Bind the query results to the GridView control.
        ' Display only location and name.
        officeGridView.DataSource = instructorQuery _
            .Execute(MergeOption.OverwriteChanges)
        officeGridView.Columns("HireDate").Visible = False
        officeGridView.Columns("PersonID").Visible = False
        officeGridView.Columns("Timestamp").Visible = False
        officeGridView.Columns("EnrollmentDate").Visible = False
        officeGridView.Columns("StudentGrades").Visible = False
        officeGridView.Columns("Courses").Visible = False
    End Sub

    Private Sub saveChanges_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles saveChanges.Click
        ' Save object changes to the database, 
        ' display a message, and refresh the form.
        schoolContext.SaveChanges()
        MessageBox.Show("Change(s) saved to the database.")
        Me.Refresh()
    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 OfficeAssignment : Form
    {
        // Create an ObjectContext instance based on SchoolEntity.
        private SchoolEntities schoolContext;

        public OfficeAssignment()
        {
            InitializeComponent();
        }

        private void OfficeAssignment_Load(object sender, EventArgs e)
        {
            schoolContext = new SchoolEntities();

            // Get Persons of type Instructor.
            ObjectQuery<Instructor> instructorQuery = schoolContext
                .People.OfType<Instructor>();

            // Bind the query results to the GridView control.
            // Display only location and name.
            officeGridView.DataSource = instructorQuery
                .Execute(MergeOption.OverwriteChanges);
            officeGridView.Columns["HireDate"].Visible = false;
            officeGridView.Columns["Timestamp"].Visible = false;
            officeGridView.Columns["PersonID"].Visible = false;
            officeGridView.Columns["EnrollmentDate"].Visible = false;
            officeGridView.Columns["StudentGrades"].Visible = false;
            officeGridView.Columns["Courses"].Visible = false;
        }

        private void saveChanges_Click(object sender, EventArgs e)
        {
            // Save object changes to the database, 
            // display a message, and refresh the form.
            schoolContext.SaveChanges();
            MessageBox.Show("Change(s) saved to the database.");
            this.Refresh();
        }
    }
}

Passaggi successivi

Il mapping di un'entità a più tabelle è stato eseguito correttamente. Per ulteriori informazioni su come creare un modello con un'entità mappata a più tabelle, vedere How to: Define a Model with a Single Entity Mapped to Two Tables. Per ulteriori informazioni sulla compilazione di applicazioni che utilizzano Entity Framework, vedere ADO.NET Entity Framework.

Vedere anche

Altre risorse

Scenari degli strumenti di Entity Data Model
Attività degli strumenti di Entity Data Model