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
Creare un progetto di applicazione console e aggiungere riferimenti a System.Data.Entity e System.Runtime.Serialization.
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).
Aggiungere gli schemi inclusi nell'argomento Procedura: definire un modello con ereditarietà tabella per gerarchia (Entity Framework) alla stessa cartella del file eseguibile.
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="
Data Source=localhost;
Initial Catalog=SchoolData;Integrated Security=True;
MultipleActiveResultSets=True""
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)