Condividi tramite


Procedura: creare ed eseguire query di oggetto utilizzando l'ereditarietà tabella per gerarchia (Entity Framework)

L'ereditarietà in Entity Data Model (EDM) offre gli stessi vantaggi dell'ereditarietà applicata nella programmazione orientata a oggetti. Le istanze di tipi nella gerarchia possono essere utilizzate insieme oppure come istanze di uno dei sottotipi. Tutti i sottotipi ereditano le proprietà del tipo di base ed è possibile accedere alle proprietà aggiuntive implementate dai sottotipi in base alle esigenze.

Per creare il progetto utilizzando l'ereditarietà tabella per gerarchia

  1. Creare un progetto di applicazione console e aggiungere riferimenti a System.Data.Entity e System.Runtime.Serialization.

  2. Aggiungere un riferimento alla DLL compilata in base al modello di ereditarietà incluso nell'argomento Procedura: definire un modello con ereditarietà tabella per gerarchia (Entity Framework).

  3. Aggiungere gli schemi inclusi nell'argomento Procedura: definire un modello con ereditarietà tabella per gerarchia (Entity Framework) alla stessa cartella del file eseguibile.

  4. Aggiungere un file di configurazione dell'applicazione con il contenuto dell'esempio seguente.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings><add name="SchoolDataLibContainer" 
   connectionString=
   "metadata=res://*/SchoolDataLib.csdl|
   res://*/SchoolDataLib.ssdl|
   res://*/SchoolDataLib.msl;provider=System.Data.SqlClient;
   provider connection string=&quot;
   Data Source=localhost;
   Initial Catalog=SchoolData;Integrated Security=True;
   MultipleActiveResultSets=True&quot;" 
   providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

Esempio

Il codice seguente consente di visualizzare tutte le istanze di tipi nella gerarchia in un ciclo foreach che enumera istanze di tipi dall'insieme People in SchoolDataEntitiesObjectContext.

Il tipo di ogni istanza viene visualizzato da una chiamata al metodo GetType.

Il secondo ciclo foreach utilizza il filtro OfType nell'insieme People per restituire solo istanze di tipo Instructor.

Solo il tipo Instructor contiene la proprietà HireDate. Il codice consente di visualizzare la proprietà HireDate con i nomi e i cognomi dei docenti restituiti dalla query.

Option Strict On
Option Explicit On
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports SchoolDataLib

Module Module1

    Sub Main()
        Try
            Using objectContext As SchoolDataLibContainer = New SchoolDataLibContainer()
                ' Display departments and administrators.
                For Each dept As Department In objectContext.Departments
                    Console.WriteLine("School: {0} Budget: {1}", _
                        dept.Name, dept.Budget)

                    ' Load associated person reference.
                    dept.AdministratorReference.Load()
                    If dept.Administrator IsNot Nothing Then
                        Console.WriteLine("Administrator: {0} {1}", _
                            dept.Administrator.FirstName, _
                            dept.Administrator.LastName)
                    End If

                    For Each student As Student In objectContext.People.OfType(Of Student)()
                        Console.WriteLine("Student: {0} {1}", student.FirstName, _
                            student.LastName)
                    Next

                    For Each person As Person In objectContext.People
                        Console.WriteLine("{0} Name: {1}", _
                            person.GetType().Name, person.LastName)
                    Next

                    For Each instructor In objectContext.People. _
                            OfType(Of Instructor)()
                        Console.WriteLine("Instructor: {0} {1} Hire Date: {2}", _
                            instructor.FirstName, _
                            instructor.LastName, _
                            instructor.HireDate)
                    Next

                Next
            End Using

        Catch ex As System.Data.MappingException
            Console.WriteLine(ex.ToString())
        Catch ex As System.Data.UpdateException
            Console.WriteLine(ex.ToString())
        End Try
    End Sub

End Module
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SchoolDataLib;
using System.Data.Objects;

namespace SchoolDataClient
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                using (SchoolDataLibContainer objectContext =
                                      new SchoolDataLibContainer ())
                {
                    // Display departments and administrators.
                    foreach (Department dept in objectContext.Departments)
                    {
                        Console.WriteLine("School: {0} Budget: {1}",
                            dept.Name,
                            dept.Budget);

                        // Load associated person reference.
                        dept.AdministratorReference.Load();
                        if (null != dept.Administrator)
                            Console.WriteLine("Administrator: {0} {1}",
                                         dept.Administrator.FirstName,
                                         dept.Administrator.LastName);
                    }

                    foreach (Student student in
                        objectContext.People.OfType<Student>())
                    {
                        Console.WriteLine("Student: {0} {1}", student.FirstName,
                            student.LastName);

                    }

                    
                    foreach (Person person in objectContext.People)
                        Console.WriteLine("{0} Name: {1}",
                            person.GetType().Name,
                            person.LastName);

                    foreach (Instructor instructor in
                        objectContext.People.OfType<Instructor>())
                        Console.WriteLine("Instructor: {0} {1} Hire Date: {2}",
                            instructor.FirstName,
                            instructor.LastName,
                            instructor.HireDate);

                    objectContext.Connection.Close();
                }
            }

            catch (System.Data.MappingException e)
            {
                Console.WriteLine(e.ToString());
            }
            catch (System.Data.UpdateException e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
}

Vedere anche

Attività

Procedura: definire un modello con ereditarietà tabella per gerarchia (Entity Framework)

Concetti

Ereditarietà (EDM)