Freigeben über


Mapping eines konzeptionellen Modells zu einem Speicherschema

Das Entity Framework stellt eine objektzentrierte Sicht auf als Entitätstypen ausgedrückte tabellarische Daten bereit. Ein Anwendungsentwickler kann sich auf die Programmierung des aus dem konzeptionellen Modell erstellten Objektmodells konzentrieren, statt sich über das Datenbankschema und den Zugriff auf Datenbankobjekte und deren Umwandlung in Programmobjekte Gedanken machen zu müssen. Das Entity Framework verwendet Modellschemas und -mappings, um Erstellungs-, Lese-, Aktualisierungs- und Löschvorgänge mit Entitäten in entsprechende Operationen in der Datenquelle umzuwandeln.

NoteHinweis

Alle in diesem Abschnitt dargestellten Teile der Mappingdatei wurden vom EDM-Generator (EdmGen.exe)-Tool generiert.

Das konzeptionelle Modell

Das konzeptionelle Modell ist ein Entitätsdatenmodell (EDM)-Schema, das die Entitäten und Zuordnungen im EDM definiert. Die XML-Syntax, in der dieses Modell definiert wird, wird als konzeptionelle Schemadefinitionssprache (Conceptual Schema Definition Language, CSDL) bezeichnet. Jeder in CSDL definierte Entitätstyp verfügt über einen Namen, einen Schlüssel für die eindeutige Identifikation der Instanzen und einen Satz von Eigenschaften. Die den Eigenschaften zugewiesenen Datentypen werden entweder als einfache Typen (skalare Eigenschaften) oder als komplexe Typen (Typen, die aus einer oder mehreren skalaren oder komplexen Eigenschaften bestehen) angegeben. Weitere Eigenschaften können angeben, dass NULL-Werte zugelassen sind oder Standardwerte zuweisen. Zuordnungen definieren die Beziehungen zwischen Entitäten. Sprachelemente und Terminologie von Entity Framework werden in Entity Framework-Terminologie ausführlicher erklärt.

Im folgenden XML-Fragment wird ein Teil des konzeptionellen Modells des "School"-EDM dargestellt, in dem die Entitätstypen Course und Department definiert werden, die durch die FK_Course_Department-Zuordnung verknüpft sind. Die Definitionen anderer Entitäten und Zuordnungen sind ausgelassen.

<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="SchoolModel" Alias="Self" 
  xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
  <EntityContainer Name="SchoolEntities">
    <EntitySet Name="Course" EntityType="SchoolModel.Course" />
    <EntitySet Name="Department" EntityType="SchoolModel.Department" />
    ...
    <AssociationSet Name="FK_Course_Department" 
      Association="SchoolModel.FK_Course_Department">
      <End Role="Department" EntitySet="Department" />
      <End Role="Course" EntitySet="Course" />
    </AssociationSet>
    ...
  </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" />
    ...
    <NavigationProperty Name="Department" 
      Relationship="SchoolModel.FK_Course_Department" 
      FromRole="Course" ToRole="Department" />
    ...
  </EntityType>
  <EntityType Name="Department">
    <Key>
      <PropertyRef Name="DepartmentID" />
    </Key>
    <Property Name="DepartmentID" Type="Int32" Nullable="false" />
    <Property Name="Name" Type="String" Nullable="false" MaxLength="50" 
      Unicode="true" FixedLength="false" />
    ...
    <NavigationProperty Name="Course" Relationship="SchoolModel.FK_Course_Department" 
      FromRole="Department" ToRole="Course" />
  </EntityType>
  ...
  <Association Name="FK_Course_Department">
    <End Role="Department" Type="SchoolModel.Department" Multiplicity="1" />
    <End Role="Course" Type="SchoolModel.Course" Multiplicity="*" />
  </Association>
  ...
</Schema>

Das Speichermodell

Für ein separates Datenmodell wird die Datenspeicherschema-Definitionssprache (Store Schema Definition Language, SSDL) verwendet, um das logische Modell für persistente Daten zu beschreiben, die im Allgemeinen in einer relationalen Datenbank gespeichert werden. Bei den in SSDL-Dateien deklarierten Datentypen von Eigenschaften handelt es sich um die Datentypen des Speichermodells. Im folgenden Speichermodellfragment wird ein Beispiel für Speichermetadaten für die Tabellen Course und Department in der "School"-Datenbank dargestellt, die durch den Fremdschlüssel FK_Course_Department verknüpft sind. Die Definitionen anderer Entitäten sind ausgelassen.

<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="SchoolModel.Store" Alias="Self" 
  Provider="System.Data.SqlClient" ProviderManifestToken="2005"   xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"   xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
  <EntityContainer Name="dbo">
    <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" 
      store:Type="Tables" /> 
    <EntitySet Name="Department" 
      EntityType="SchoolModel.Store.Department" store:Type="Tables" />
     ...
    <AssociationSet Name="FK_Course_Department" 
      Association="SchoolModel.Store.FK_Course_Department">
      <End Role="Department" EntitySet="Department" />
      <End Role="Course" EntitySet="Course" />
    </AssociationSet>
    ...
  </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" />
    ...
  </EntityType>
  <EntityType Name="Department">
    <Key>
      <PropertyRef Name="DepartmentID" />
    </Key>
    <Property Name="DepartmentID" Type="int" Nullable="false" />
    <Property Name="Name" Type="nvarchar" Nullable="false" 
      MaxLength="50" />
    ...
  </EntityType>
  ...
  <Association Name="FK_Course_Department">
    <End Role="Department" Type="SchoolModel.Store.Department" 
      Multiplicity="1" />
    <End Role="Course" Type="SchoolModel.Store.Course" Multiplicity="*" />
    <ReferentialConstraint>
      <Principal Role="Department">
        <PropertyRef Name="DepartmentID" />
      </Principal>
      <Dependent Role="Course">
        <PropertyRef Name="CourseID" />
      </Dependent>
    </ReferentialConstraint>
  </Association>
  ...
</Schema>

Die Mappingspezifikation

In einer Mappingspezifikation wird die Mapping-Spezifikationssprache (Mapping Specification Language, MSL) verwendet, um die im konzeptionellen Modell deklarierten Typen mit den im Speichermodell deklarierten Datenbankmetadaten zu verknüpfen. In diesem MSL-Fragment wird ein 1:1-Mapping zwischen dem konzeptionellen Modell und dem Speichermodell der Entitäten Course und Department im "School"-Modell dargestellt.

<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S" 
  xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
  <EntityContainerMapping StorageEntityContainer="dbo" 
    CdmEntityContainer="SchoolEntities">
    <EntitySetMapping Name="Course">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Course)">
        <MappingFragment StoreEntitySet="Course">
          <ScalarProperty Name="CourseID" ColumnName="CourseID" />
          <ScalarProperty Name="Title" ColumnName="Title" />
          ...
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
    <EntitySetMapping Name="Department">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Department)">
        <MappingFragment StoreEntitySet="Department">
         <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
          <ScalarProperty Name="Name" ColumnName="Name" />
          ...
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
    ...
    <AssociationSetMapping Name="FK_Course_Department" 
      TypeName="SchoolModel.FK_Course_Department" 
      StoreEntitySet="Course">
      <EndProperty Name="Department">
        <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
      </EndProperty>
      <EndProperty Name="Course">
        <ScalarProperty Name="CourseID" ColumnName="CourseID" />
      </EndProperty>
      <Condition ColumnName="DepartmentID" IsNull="false" />
    </AssociationSetMapping>
    ...
  </cs:EntityContainerMapping>
</Mapping>

Diskussion

Im hier diskutierten "School"-Modell wird ein einfaches 1:1-Mapping zwischen einer konzeptionellen Entität und einer Datenbanktabelle verwendet. Das Entity Framework unterstützt jedoch auch komplexere Mappings. In der relationalen Datenbank könnte beispielsweise mehr als eine Tabelle zum Speichern der zu den einzelnen Mitarbeitern gehörenden Daten verwendet werden. Eine Tabelle könnte Kontaktinformationen für alle Personen enthalten, während eine separate verknüpfte Tabelle Informationen enthält, die nur Mitarbeiter betreffen. Das Entity Framework ermöglicht Entwicklern die Definition von Entitäten mit Vererbungshierarchien und das Zuordnen einer Entität zu Daten aus mehr als einer Tabelle in einer Datenbank. Dabei ist die volle Unterstützung von Datenaktualisierungen, -einfügungen und -löschungen gewährleistet. Weitere Informationen finden Sie unter Datenmodellierung im Entity Framework.

Siehe auch

Konzepte

Entity Framework-Terminologie

Weitere Ressourcen

Erste Schritte (Entity Framework)
EDM-Spezifikationen
Definieren von erweiterten Datenmodellen (Entity Framework-Aufgaben)
Schemas und Mappingspezifikation (Entity Framework)