Partager via


Mappage d'un modèle conceptuel à un schéma de stockage

Entity Framework fournit une vue centrée sur l'objet des données tabulaires, exprimées en tant que types d'entité. Un développeur d'applications n'a besoin de se concentrer que sur la programmation par rapport au modèle d'objet généré à partir du modèle conceptuel. Il n'a pas également à se soucier du schéma de base de données, de la façon d'accéder aux objets de base de données et de les transformer en objets de programmation. Entity Framework a recours à des schémas de modèle et à des mappages pour transformer les opérations de création, lecture, mise à jour et suppression d'entités en opérations équivalentes dans la source de données.

NoteRemarque

Tous les fragments de fichiers de mappage présentés dans cette section sont générés par l'outil EDM Generator (EdmGen.exe).

Modèle conceptuel

Un modèle conceptuel est un schéma Modèle de données d'entité (EDM) qui définit les entités et les associations dans le modèle EDM. La syntaxe XML qui définit ce modèle est appelée CSDL (Conceptual Schema Definition Language). Les types d'entité définis dans CSDL possèdent chacun 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. D'autres propriétés peuvent également indiquer une acceptation des valeurs null ou attribuer une valeur par défaut. Les associations définissent les relations entre des entités. Les éléments de langage et la terminologie Entity Framework sont expliqués de façon plus détaillée dans Terminologie Entity Framework.

Le fragment XML ci-dessous représente une partie du modèle conceptuel du modèle EDM School qui définit les types d'entité Course et Department qui sont liés par l'association FK_Course_Department, tandis que les autres entités et associations sont supprimées.

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

Modèle de stockage

Un modèle de données distinct utilise le langage SSDL (Store Schema Definition Language) pour décrire le modèle logique pour les données persistantes, qui sont généralement stockées dans une base de données relationnelle. Les types de données des propriétés déclarées dans les fichiers 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.

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

Spécification de mappage

Une spécification de mappage s'appuie sur le langage MSL (Mapping Specification Language) pour établir un lien entre les types déclarés dans le modèle conceptuel et les métadonnées de base de données déclarées dans le 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.

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

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. Par exemple, la base de données relationnelle peut stocker les données relatives à chaque employé dans plusieurs tables. Une table peut contenir les informations de contact de toutes les personnes et une autre table associée peut contenir des informations qui concernent uniquement les employés. Entity Framework permet aux développeurs de définir des entités en utilisant des hiérarchies d'héritage et de mapper une entité aux données de plusieurs tables d'une base de données, avec une prise en charge complète des mises à jour, des insertions et des suppressions de données. Pour plus d'informations, voir Modélisation des données dans Entity Framework.

Voir aussi

Concepts

Terminologie Entity Framework

Autres ressources

Mise en route (Entity Framework)
Spécifications EDM
Définition de modèles de données avancés (Tâches Entity Framework)
Schémas et spécification de mappage (Entity Framework)