Gewusst wie: Definieren eines Modells mit einer 'Tabelle pro Typ'-Vererbung (Entity Framework)
In diesem Thema wird beschrieben, wie ein konzeptionelles Modell manuell erstellt wird, das über eine "Tabelle pro Typ"-Vererbungshierarchie verfügt. Bei der "Tabelle pro Typ"-Vererbung wird eine separate Tabelle in der Datenbank verwendet, um die Daten für nicht geerbte Eigenschaften und Schlüsseleigenschaften für jeden Typ in der Vererbungshierarchie zu verwalten.
Hinweis: |
---|
Es wird empfohlen, zum Definieren eines Modells mit "Tabelle pro Typ"-Vererbung die ADO.NET Entity Data Model Tools zu verwenden.Weitere Informationen finden Sie unter Walkthrough: Mapping Inheritance - Table-per-Type. |
Die grundlegenden Schritte zum manuellen Definieren eines Modells mit "Tabelle pro Typ"-Vererbung sind die folgenden:
Definieren Sie eine Entitätenmenge im konzeptionellen Modell, die den Basisentitätstyp und die abgeleiteten Typen enthält. Weitere Informationen finden Sie unter EntitySet-Element (CSDL).
Definieren Sie mithilfe des BaseType-Attributs abgeleitete Entitätstypen im konzeptionellen Modell, und definieren Sie nur nicht geerbte Eigenschaften für die abgeleiteten Typen. Weitere Informationen finden Sie unter EntityType-Element (CSDL).
Ordnen Sie den Basisentitätstyp und die abgeleitete Typen im gleichen EntitySetMapping-Element in der Mapping Specification Language (MSL) zu. Ordnen Sie ggf. geerbte Eigenschaften Tabellenspalten zu. Verwenden Sie die
IsTypeOf
-Syntax, wenn Sie den Wert des TypeName-Attributs festlegen. Weitere Informationen finden Sie unter EntitySetMapping-Element (MSL).
Im folgenden Beispiel wird davon ausgegangen, dass Sie die Beispieldatenbank "School" installiert und das Projekt manuell zur Verwendung von Entity Framework konfiguriert haben. Weitere Informationen finden Sie unter Erstellen der Beispieldatenbank "School" (Entity Framework-Schnellstart) und Konfigurieren des Entity Framework (Entity Framework-Aufgaben).
So erstellen Sie das Speichermodell
Fügen Sie dem Projekt die folgende XML-Datei hinzu, und geben Sie ihr den Namen
School.ssdl
.<?xml version="1.0" encoding="utf-8" ?> <Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="https://schemas.microsoft.com/ado/2009/02/edm/ssdl"> <EntityContainer Name="SchoolModelStoreContainer"> <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" store:Type="Tables" Schema="dbo" /> <EntitySet Name="OnlineCourse" EntityType="SchoolModel.Store.OnlineCourse" store:Type="Tables" Schema="dbo" /> <EntitySet Name="OnsiteCourse" EntityType="SchoolModel.Store.OnsiteCourse" store:Type="Tables" Schema="dbo" /> </EntityContainer> <EntityType Name="Course"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="int" Nullable="false" /> <Property Name="Title" Type="nvarchar" Nullable="false" MaxLength="100" /> <Property Name="Credits" Type="int" Nullable="false" /> <Property Name="DepartmentID" Type="int" Nullable="false" /> </EntityType> <EntityType Name="OnlineCourse"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="int" Nullable="false" /> <Property Name="URL" Type="nvarchar" Nullable="false" MaxLength="100" /> </EntityType> <EntityType Name="OnsiteCourse"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="int" Nullable="false" /> <Property Name="Location" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="Days" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="Time" Type="smalldatetime" Nullable="false" /> </EntityType> </Schema>
So erstellen Sie das konzeptionelle Modell
Fügen Sie dem Projekt die folgende XML-Datei hinzu, und geben Sie ihr den Namen
School.csdl
. Beachten Sie Folgendes:Nur eine Entitätenmenge, Courses, wird für die drei Entitätstypen definiert: Course, OnlineCourse und OnsiteCourse.
Der OnlineCourse-Entitätstyp und der OnsiteCourse-Entitätstyp sind gemäß dem
BaseType
-Attribut in ihren Definitionen abgeleitete Typen.Die für den OnlineCourse-Entitätstyp und den OnsiteCourse-Entitätstyp definierten Eigenschaften sind lediglich nicht geerbte Eigenschaften.
<?xml version="1.0" encoding="utf-8" ?> <Schema Namespace="SchoolModel" Alias="Self" xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="https://schemas.microsoft.com/ado/2008/09/edm"> <EntityContainer Name="SchoolEntities" annotation:LazyLoadingEnabled="true"> <EntitySet Name="Courses" EntityType="SchoolModel.Course" /> </EntityContainer> <EntityType Name="Course"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="Int32" Nullable="false" /> <Property Name="Title" Type="String" Nullable="false" MaxLength="100" Unicode="true" FixedLength="false" /> <Property Name="Credits" Type="Int32" Nullable="false" /> <Property Name="DepartmentID" Type="Int32" Nullable="false" /> </EntityType> <EntityType Name="OnlineCourse" BaseType="SchoolModel.Course"> <Property Name="URL" Type="String" Nullable="false" MaxLength="100" Unicode="true" FixedLength="false" /> </EntityType> <EntityType Name="OnsiteCourse" BaseType="SchoolModel.Course"> <Property Name="Location" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" /> <Property Name="Days" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" /> <Property Name="Time" Type="DateTime" Nullable="false" /> </EntityType> </Schema>
So definieren Sie die Zuordnung zwischen dem konzeptionellen Modell und dem Speichermodell
Fügen Sie dem Projekt die folgende XML-Datei hinzu, und geben Sie ihr den Namen
School.msl
. Beachten Sie Folgendes:Die Zuordnung für die Entitätstypen Course, OnlineCourse und OnsiteCourse wird im gleichen EntitySetMapping-Element definiert.
Die geerbten CourseID-Eigenschaften für OnlineCourse und OnsiteCourse werden den entsprechenden Spalten in den zugrunde liegenden Datenbanktabellen zugeordnet.
Für jede Entitätstypzuordnung wird die
IsTypeOf
-Syntax zur Angabe des Entitätstyps verwendet, der zugeordnet wird.
<?xml version="1.0" encoding="utf-8" ?> <Mapping Space="C-S" xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs"> <EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer" CdmEntityContainer="SchoolEntities"> <EntitySetMapping Name="Courses"> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Course)"> <MappingFragment StoreEntitySet="Course"> <ScalarProperty Name="CourseID" ColumnName="CourseID" /> <ScalarProperty Name="Title" ColumnName="Title" /> <ScalarProperty Name="Credits" ColumnName="Credits" /> <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" /> </MappingFragment> </EntityTypeMapping> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.OnlineCourse)"> <MappingFragment StoreEntitySet="OnlineCourse"> <ScalarProperty Name="CourseID" ColumnName="CourseID" /> <ScalarProperty Name="URL" ColumnName="URL" /> </MappingFragment> </EntityTypeMapping> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.OnsiteCourse)"> <MappingFragment StoreEntitySet="OnsiteCourse"> <ScalarProperty Name="CourseID" ColumnName="CourseID" /> <ScalarProperty Name="Location" ColumnName="Location" /> <ScalarProperty Name="Days" ColumnName="Days" /> <ScalarProperty Name="Time" ColumnName="Time" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> </EntityContainerMapping> </Mapping>
Siehe auch
Aufgaben
Gewusst wie: Definieren eines Modells mit 'Tabelle pro Hierarchie'-Vererbung (Entity Framework)
Weitere Ressourcen
CSDL-, SSDL- und MSL-Spezifikationen
Entity Data Model: Inheritance
Definieren von erweiterten Datenmodellen (Entity Framework-Aufgaben)