Ereditarietà TPT della finestra di progettazione

Questa procedura dettagliata illustra come implementare l'ereditarietà della tabella per tipo (TPT) nel modello usando Entity Framework Designer (EF Designer). 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à.

In questa procedura dettagliata verrà eseguito il mapping delle entità Course (tipo di base), OnlineCourse (deriva da Course) e SiteCourse (deriva da Course) alle tabelle con gli stessi nomi. Si creerà un modello dal database e quindi si modificherà il modello per implementare l'ereditarietà TPT.

È anche possibile iniziare con Model First e quindi generare il database dal modello. Ef Designer usa la strategia TPT per impostazione predefinita e pertanto qualsiasi ereditarietà nel modello verrà mappata a tabelle separate.

Altre opzioni di ereditarietà

Table-per-Hierarchy (TPH) è un altro tipo di ereditarietà in cui viene usata una tabella di database per gestire i dati per tutti i tipi di entità in una gerarchia di ereditarietà.  Per informazioni su come eseguire il mapping dell'ereditarietà di tabelle per gerarchia con Entity Designer, vedere Ereditarietà TPH di Entity Designer. 

Si noti che i modelli TPC (Table-per-Concrete Type Inheritance) e ereditarietà mista sono supportati dal runtime di Entity Framework, ma non sono supportati da Ef Designer. Se si vuole usare TPC o ereditarietà mista, sono disponibili due opzioni: usare Code First o modificare manualmente il file EDMX. Se si sceglie di usare il file EDMX, la finestra Dettagli mapping verrà attivata in modalità provvisoria e non sarà possibile usare la finestra di progettazione per modificare i mapping.

Prerequisiti

Per completare questa procedura dettagliata, sarà necessario:

  • Una versione recente di Visual Studio.
  • Database di esempio School.

Configurare il progetto

  • Aprire Visual Studio 2012.
  • Selezionare File -> Nuovo -> Progetto
  • Nel riquadro sinistro fare clic su Visual C#, quindi selezionare il modello console .
  • Immettere TPTDBFirstSample come nome.
  • Seleziona OK.

Create a Model (Creare un modello)

  • Fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni e scegliere Aggiungi -> Nuovo elemento.
  • Selezionare Dati dal menu a sinistra e quindi selezionare ADO.NET Entity Data Model nel riquadro Modelli.
  • Immettere TPTModel.edmx per il nome del file e quindi fare clic su Aggiungi.
  • Nella finestra di dialogo Scegli contenuto modello selezionare** Genera dal database**, quindi fare clic su Avanti.
  • Fare clic su Nuovo Connessione ion. Nella finestra di dialogo Proprietà Connessione ion immettere il nome del server ( ad esempio (localdb)\mssqllocaldb), selezionare il metodo di autenticazione, digitare School per il nome del database e quindi fare clic su OK. La finestra di dialogo Choose Your Data Connessione ion viene aggiornata con l'impostazione di connessione al database.
  • Nella finestra di dialogo Scegli oggetti di database selezionare le tabelle Department, Course, OnlineCourse e SiteCourse nel nodo Tabelle.
  • Fare clic su Fine.

Viene visualizzato Entity Designer, che fornisce un'area di progettazione per la modifica del modello. Tutti gli oggetti selezionati nella finestra di dialogo Scegli oggetti di database vengono aggiunti al modello.

Implementare l'ereditarietà tabella per tipo

  • Nell'area di progettazione fare clic con il pulsante destro del mouse sul tipo di entità OnlineCourse e scegliere Proprietà.
  • Nella finestra Proprietà impostare la proprietà Tipo di base su Course.
  • Fare clic con il pulsante destro del mouse sul tipo di entità SiteCourse e scegliere Proprietà.
  • Nella finestra Proprietà impostare la proprietà Tipo di base su Course.
  • Fare clic con il pulsante destro del mouse sull'associazione (la riga) tra i tipi di entità OnlineCourse e Course . Selezionare Elimina dal modello.
  • Fare clic con il pulsante destro del mouse sull'associazione tra i tipi di entità SiteCourse e Course . Selezionare Elimina dal modello.

La proprietà CourseID verrà ora eliminata da OnlineCourse e SiteCourse perché queste classi ereditano CourseID dal tipo di base Course.

  • Fare clic con il pulsante destro del mouse sulla proprietà CourseID del tipo di entità OnlineCourse e quindi scegliere Elimina dal modello.
  • Fare clic con il pulsante destro del mouse sulla proprietà CourseID del tipo di entità SiteCourse e quindi scegliere Elimina dal modello
  • A questo punto l'ereditarietà tabella per tipo risulta implementata.

Table Per Type

Usare il modello

Aprire il file Program.cs in cui è definito il metodo Main . Incollare il codice seguente nella funzione Main . Il codice esegue tre query. La prima query riporta tutti i corsi correlati al reparto specificato. La seconda query usa il metodo OfType per restituire OnlineCourses correlati al reparto specificato. La terza query restituisce OnsiteCourses.

    using (var context = new SchoolEntities())
    {
        foreach (var department in context.Departments)
        {
            Console.WriteLine("The {0} department has the following courses:",
                               department.Name);

            Console.WriteLine("   All courses");
            foreach (var course in department.Courses )
            {
                Console.WriteLine("     {0}", course.Title);
            }

            foreach (var course in department.Courses.
                OfType<OnlineCourse>())
            {
                Console.WriteLine("   Online - {0}", course.Title);
            }

            foreach (var course in department.Courses.
                OfType<OnsiteCourse>())
            {
                Console.WriteLine("   Onsite - {0}", course.Title);
            }
        }
    }