Gewusst wie: Erstellen und Ausführen von Objektabfragen mithilfe der 'Tabelle pro Typ'-Vererbung (Entity Framework)
Die Vererbung bietet im Entitätsdatenmodell (EDM) dieselben Vorteile wie 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 die zusätzlichen Eigenschaften zugegriffen werden, die von den Untertypen implementiert werden.
So erstellen Sie das Projekt, in dem die 'Tabelle pro Typ'-Vererbung verwendet wird
Erstellen Sie ein Konsolenanwendungsprojekt mit dem Namen SchoolDataClient, und fügen Sie Verweise auf System.Data.Entity und System.Runtime.Serialization hinzu.
Fügen Sie einen Verweis auf die DLL hinzu, die aus der unter Gewusst wie: Definieren eines Modells mit einer 'Tabelle pro Typ'-Vererbung (Entity Framework) beschriebenen Vererbungshierarchie erstellt wurde.
Fügen Sie die Schemas aus dem Vererbungsprojekt dem gleichen Ordner hinzu wie die ausführbare Datei SchoolDataClient.
Fügen Sie dem Projekt eine Anwendungskonfigurationsdatei mit dem folgenden Inhalt 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
Mit dem folgenden Code werden die Daten für alle Abteilungen des Systems angezeigt.
Mit einer foreach
-Schleife im Basistyp Department werden die Daten für die Typen DeptBusiness, DeptEngineering und DeptMusic angezeigt, die vom Department-Typ abgeleitet wurden.
In der zweiten foreach
-Schleife ist dargestellt, wie nur die technischen Kurse aus der Departments-Auflistung abgerufen werden können.
Der OfType-Operator ermöglicht das typbasierte Filtern der Werte aus einer Quelle.
Die Departments-Auflistung enthält eine Geschäftsabteilung (Department of Business), eine Technikabteilung (Department of Engineering) und eine Musikabteilung (Department of Music), die generische Spezifikation gibt jedoch nur die in den spitzen Klammern angegebenen Typen zurück.
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());
}
}
}
}
Siehe auch
Aufgaben
Gewusst wie: Definieren eines Modells mit einer 'Tabelle pro Typ'-Vererbung (Entity Framework)