Condividi tramite


Procedura: creare ed eseguire query di oggetto utilizzando l'ereditarietà tabella per tipo (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 tipo

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

  2. Aggiungere un riferimento alla DLL compilata in base alla gerarchia di ereditarietà descritta in Procedura: definire un modello con ereditarietà tabella per tipo (Entity Framework).

  3. Aggiungere gli schemi dal progetto di ereditarietà alla stessa cartella del file eseguibile SchoolDataClient.

  4. Aggiungere al progetto un file di configurazione dell'applicazione con il contenuto 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

Nel codice seguente vengono visualizzati i dati per tutti i reparti nel sistema.

Un ciclo foreach nel tipo di base Department visualizzerà i dati per i tipi DeptBusiness, DeptEngineering e DeptMusic derivati dal tipo Department.

Il secondo ciclo foreach indica come ottenere solo gli istituti tecnici dall'insieme Departments.

L'operatore OfType consente di filtrare i valori da un'origine in base al tipo.

L'insieme Departments contiene i reparti tecnici, commerciali, musicali, ma la specifica generica restituisce solo quelli del tipo specificato tra parentesi angolari.

Option Strict On
Option Explicit On
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml
Imports System.Xml.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 contact reference if any.
                    dept.AdministratorReference.Load()
                    If dept.Administrator IsNot Nothing Then
                        Console.WriteLine("Administrator: {0} {1}", _
                            dept.Administrator.FirstName, _
                            dept.Administrator.LastName)
                    End If
                Next

                For Each eDept As DeptEngineering In _
                        objectContext.Departments.OfType(Of DeptEngineering)()
                    Console.WriteLine("{0} LabBudget: {1} FiberOp Budget: {2}", _
                        eDept.Name, eDept.LabBudget.ToString(), _
                        eDept.FiberOpticsBudget.ToString())
                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;

namespace SchoolDataTPTClient
{
    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 contact reference if any.
                        dept.AdministratorReference.Load();
                        if (null != dept.Administrator)
                            Console.WriteLine("Administrator: {0} {1}",
                                         dept.Administrator.FirstName,
                                         dept.Administrator.LastName);
                    }

                    foreach (DeptEngineering eDept in
                        objectContext.Departments.OfType<DeptEngineering>())
                        Console.WriteLine("{0} LabBudget: {1} FiberOp Budget: {2}",
                            eDept.Name, eDept.LabBudget.ToString(), 
                            eDept.FiberOpticsBudget.ToString());
                    }

                }

            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 tipo (Entity Framework)