Share via


Mappage d'un modèle conceptuel à un modèle de stockage

Entity Framework utilise un modèle conceptuel pour fournir une vue centrée sur l'objet des données, exprimée sous la forme de types d'entités et d'associations. Un développeur d'applications n'a besoin de se concentrer que sur la programmation par rapport aux classes générées à partir du modèle conceptuel. Il n'a pas également à se soucier du schéma de stockage ni de la façon d'accéder aux objets dans la banque de données et de les transformer en objets de programmation. Entity Framework utilise un modèle conceptuel, un modèle de stockage et un mappage entre ces modèles pour transformer des opérations de création, de lecture, de mise à jour et de suppression sur des entités en opérations équivalentes dans la source de données.

Bb399232.note(fr-fr,VS.100).gifRemarque :
Tous les fragments de fichiers de mappage présentés dans cette section sont générés par l'Entity Data Model Wizard.

Modèle conceptuel

Le modèle conceptuel pour une application exprime des entités et des relations dans le langage CSDL (Conceptual Schema Definition Language), qui est une implémentation d'Entity Data Model. Le langage CSDL est un langage basé sur XML. Les types d'entités définis dans le langage CSDL possèdent tous un nom, une clé pour identifier les instances de manière unique, ainsi qu'un ensemble de propriétés. Les types de données assignés aux propriétés sont spécifiés soit comme des types simples, qui correspondent à des propriétés scalaires, soit comme des types complexes, c'est-à-dire des types constitués d'une ou plusieurs propriétés scalaires ou complexes. Des attributs XML peuvent également indiquer une acceptation des valeurs null ou attribuer une valeur par défaut. Les associations définissent les relations entre les entités. Les éléments de langage et la terminologie d'Entity Framework sont expliqués plus en détail dans Terminologie Entity Framework.

Le fragment XML suivant représente une partie du modèle conceptuel School (selon la base de données d'exemple School). L'exemple montre les types d'entités Course et Department liés par l'association FK_Course_Department, tandis que les autres entités et associations sont supprimées.

<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>

Modèle de stockage

Le modèle de stockage est décrit avec le langage SSDL (Store Schema Definition Language). Les types de données des propriétés déclarées dans le langage SSDL sont ceux du modèle de stockage. Ce fragment de modèle de stockage présente un exemple de métadonnées de stockage pour les tables Course et Department de la base de données School qui sont liées par la clé étrangère FK_Course_Department, tandis que les autres entités sont supprimées.

<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>

Spécification de mappage

Une spécification de mappage utilise le langage MSL (Mapping Specification Language) pour mapper le modèle conceptuel au modèle de stockage. Ce fragment MSL illustre un mappage un-à-un entre le modèle conceptuel et le modèle de stockage pour les entités Course et Department du modèle School.

<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>

Discussion

Si le modèle School évoqué ici utilise un mappage un-à-un simple entre une entité conceptuelle et une table de base de données, Entity Framework prend en charge des mappages plus complexes, tels que le mappage de table par hiérarchie ou le mappage de table par type. Pour plus d'informations, consultez Entity Data Model Tools Scenarios et Définition de modèles de données avancés (Tâches Entity Framework).

Voir aussi

Concepts

Terminologie Entity Framework

Autres ressources

Mise en route (Entity Framework)
Définition de modèles de données avancés (Tâches Entity Framework)
Spécifications CSDL, SSDL et MSL