Gewusst wie: Erstellen und Ausführen von Objektabfragen mithilfe der 'Tabelle pro Hierarchie'-Vererbung (Entity Framework)
Die Vererbung im Entitätsdatenmodell (EDM) stellt dieselben Vorteile bereit wie die Vererbung in der objektorientierten Programmierung. Instanzen von Typen in der Hierarchie können gemeinsam oder als Instanzen eines der Untertypen bearbeitet werden. Alle Untertypen erben die Eigenschaften des Basistyps und ggf. kann auf zusätzliche Eigenschaften, die von Untertypen implementiert werden, zugegriffen werden.
So erstellen Sie das Projekt, in dem 'Tabelle pro Hierarchie'-Vererbung verwendet wird
Erstellen Sie ein Konsolenanwendungsprojekt, und fügen Sie Verweise auf System.Data.Entity und System.Runtime.Serialization hinzu.
Fügen Sie einen Verweis auf die aus dem Vererbungsmodell im Thema Gewusst wie: Definieren eines Modells mit 'Tabelle pro Hierarchie'-Vererbung (Entity Framework) erstellten DLL hinzu.
Kopieren Sie die Schemas aus dem Thema Gewusst wie: Definieren eines Modells mit 'Tabelle pro Hierarchie'-Vererbung (Entity Framework) in denselben Ordner wie die ausführbare Datei.
Fügen Sie eine Anwendungskonfigurationsdatei mit dem Inhalt des folgenden Beispiels hinzu.
<?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>
Beispiel
Der folgende Code zeigt alle Instanzen von Typen in der Hierarchie in einer foreach
-Schleife an, die Instanzen von Typen aus der People-Auflistung im SchoolDataEntitiesObjectContext aufzählt.
Der Typ jeder Instanz wird durch einen Aufruf der GetType-Methode angezeigt.
Die zweite foreach
-Schleife verwendet einen OfType-Filter für die People-Auflistung, um nur Instanzen vom Typ Instructor zurückzugeben.
Nur der Typ "Instructor" enthält die HireDate-Eigenschaft. Der Code zeigt HireDate gemeinsam mit Vor- und Nachnamen der von der Abfrage zurückgegebenen "Instructor"-Elementen an.
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());
}
}
}
}
Siehe auch
Aufgaben
Gewusst wie: Definieren eines Modells mit 'Tabelle pro Hierarchie'-Vererbung (Entity Framework)