Zuordnen eines konzeptionellen Modells zu einem Speichermodell

Entity Framework stellt mit einem konzeptionellen Modell eine objektorientierte Datenansicht bereit, die mithilfe von Entitätstypen und Zuordnungen ausgedrückt wird. Ein Anwendungsentwickler kann sich auf die Programmierung der aus dem konzeptionellen Modell erstellten Klassen konzentrieren, statt sich über das Speicherschema und den Zugriff auf Objekte im Datenspeicher und deren Umwandlung in Programmobjekte Gedanken machen zu müssen. Entity Framework verwendet ein konzeptionelles Modell, ein Speichermodell und Zuordnungen unter diesen Modellen, um Erstell-, Lese-, Aktualisierungs- und Löschvorgänge, die auf Entitäten angewendet werden, in entsprechende Vorgänge in der Datenquelle umzuwandeln.

Bb399232.note(de-de,VS.100).gifHinweis:
Alle in diesem Abschnitt dargestellten Teile der Zuordnungsdatei wurden von Entity Data Model Wizard generiert.

Das konzeptionelle Modell

Das konzeptionelle Modell für eine Anwendung drückt Entitäten und Beziehungen in konzeptioneller Schemadefinitionssprache (CSDL) aus, die eine Implementierung des Entity Data Model ist. CSDL ist eine XML-basierte Sprache. 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. XML-Attribute können ebenfalls das Zulassen von NULL-Werten angeben oder Standardwerte zuweisen. Zuordnungen definieren die Beziehungen zwischen Entitäten. Entity Framework -Sprachelemente und Terminologie werden unter Entity Framework-Terminologie genauer erklärt.

Das folgende XML-Fragment stellt einen Teil des konzeptionellen Modells "School" (auf Grundlage der Beispieldatenbank "School") dar. Das Beispiel veranschaulicht die Course- und Department-Entitätstypen, die durch die FK_Course_Department-Zuordnung verknüpft sind (anderen Entitäten und Zuordnungen wurden entfernt).

<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">
   <EntitySet Name="Courses" EntityType="SchoolModel.Course" />
   <EntitySet Name="Departments" EntityType="SchoolModel.Department" />

  <AssociationSet Name="FK_Course_Department" 
                  Association="SchoolModel.FK_Course_Department">
            <End Role="Department" EntitySet="Departments" />
            <End Role="Course" EntitySet="Courses" />
  </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" />
       <Property Name="Credits" Type="Int32" Nullable="false" />
       <Property Name="DepartmentID" Type="Int32" Nullable="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" />
       <Property Name="Budget" Type="Decimal" Nullable="false" 
                 Precision="19" Scale="4" />
       <Property Name="StartDate" Type="DateTime" Nullable="false" />
       <Property Name="Administrator" Type="Int32" />
       <NavigationProperty Name="Courses" 
                       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="*" />
          <ReferentialConstraint>
            <Principal Role="Department">
              <PropertyRef Name="DepartmentID" />
            </Principal>
            <Dependent Role="Course">
              <PropertyRef Name="DepartmentID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>

      </Schema>

Das Speichermodell

Die Speichermodelldatei ist in der Datenspeicherschema-Definitionssprache (Store Schema Definition Language, SSDL) beschrieben. Bei den in SSDL 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.

<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/2009/02/edm/ssdl">
  <EntityContainer Name="SchoolModelStoreContainer">
   <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" 
              store:Type="Tables" Schema="dbo" />
   <EntitySet Name="Department" 
              EntityType="SchoolModel.Store.Department" 
              store:Type="Tables" Schema="dbo" />

    <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" />
       <Property Name="Credits" Type="int" Nullable="false" />
       <Property Name="DepartmentID" Type="int" Nullable="false" />
  </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" />
       <Property Name="Budget" Type="money" Nullable="false" />
       <Property Name="StartDate" Type="datetime" Nullable="false" />
       <Property Name="Administrator" Type="int" />
  </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="DepartmentID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
        
</Schema>

Die Mappingspezifikation

Eine Zuordnungsspezifikation verwendet Mapping Specification Language (MSL), um dem Speichermodell das konzeptionelle Modell zuzuordnen. In diesem MSL-Fragment wird eine 1:1-Zuordnung zwischen dem konzeptionellen Modell und dem Speichermodell der Entitäten Course und Department im "School"-Modell dargestellt.

<Mapping Space="C-S" 
          xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs">
  <EntityContainerMapping 
                 StorageEntityContainer="SchoolModelStoreContainer" 
                 CdmEntityContainer="SchoolEntities">
    <EntitySetMapping Name="Courses">
     <EntityTypeMapping TypeName="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>
    </EntitySetMapping>
    <EntitySetMapping Name="Departments">
     <EntityTypeMapping TypeName="SchoolModel.Department">
      <MappingFragment StoreEntitySet="Department">
       <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
       <ScalarProperty Name="Name" ColumnName="Name" />
       <ScalarProperty Name="Budget" ColumnName="Budget" />
       <ScalarProperty Name="StartDate" ColumnName="StartDate" />
       <ScalarProperty Name="Administrator" 
                       ColumnName="Administrator" />
      </MappingFragment>
     </EntityTypeMapping>
    </EntitySetMapping>
   </EntityContainerMapping>
</Mapping>

Diskussion

Im hier diskutierten Modell "School" wird ein einfache 1:1-Zuordnung zwischen einer konzeptionellen Entität und einer Datenbanktabelle verwendet. Entity Framework unterstützt jedoch auch komplexere Zuordnungen, wie "Tabelle pro Hierarchie" oder "Tabelle pro Typ". Weitere Informationen finden Sie unter Entity Data Model Tools Scenarios und Definieren von erweiterten Datenmodellen (Entity Framework-Aufgaben).

Siehe auch

Konzepte

Entity Framework-Terminologie

Weitere Ressourcen

Erste Schritte (Entity Framework)
Definieren von erweiterten Datenmodellen (Entity Framework-Aufgaben)
CSDL-, SSDL- und MSL-Spezifikationen