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
Creare un progetto di applicazione console denominato SchoolDataClient e aggiungere riferimenti a System.Data.Entity e System.Runtime.Serialization.
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).
Aggiungere gli schemi dal progetto di ereditarietà alla stessa cartella del file eseguibile SchoolDataClient.
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="
Data Source=localhost;
Initial Catalog=SchoolData;Integrated Security=True;
MultipleActiveResultSets=True""
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)