Concepts clés d'Entity Data Model

Le modèle EDM (Entity Data Model) utilise trois concepts clés pour décrire la structure des données : type d’entité, type d’association et propriété. Il s'agit des concepts les plus importants pour décrire la structure des données dans n'importe quelle implémentation du modèle EDM.

Type d’entité

Le type d’entité est le composant fondamental pour la description de la structure des données avec le modèle EDM. Dans un modèle conceptuel, les types d’entité sont construits à partir de propriétés et décrivent la structure des concepts de plus haut niveau, comme les clients et les commandes dans une application de gestion. De la même manière qu'une définition de classe dans un logiciel est un modèle pour les instances de la classe, un type d'entité est un modèle pour les entités. Une entité représente un objet spécifique (tel qu'un client ou une commande spécifique). Chaque entité doit avoir une clé d’entité unique dans un jeu d’entités. Un jeu d'entités est une collection d'instances d'un type d'entité spécifique. Les jeux d’entités (et les ensembles d’associations) sont regroupés logiquement dans un conteneur d’entités.

Les types d'entité prennent en charge l'héritage ; autrement dit, un type d'entité peut être dérivé d'un autre. Pour plus d’informations, consultez Entity Data Model : Héritage.

Type d'association

Un type d’association (ou association) est le composant fondamental pour la description des relations dans le modèle EDM. Dans un modèle conceptuel, une association représente une relation entre deux types d'entité (tels que Customer et Order). Chaque association a deux terminaisons d’association qui spécifient les types d’entité impliqués dans l’association. Chaque terminaison d’association spécifie également une multiplicité de terminaison d’association qui indique le nombre d’entités qui peuvent se trouver à cette terminaison de l’association. La multiplicité de terminaison d'association peut avoir une valeur égale à un (1), zéro ou un (0..1), ou plusieurs (*). Il est possible d’accéder aux entités au niveau de la terminaison d’une association via les propriétés de navigation ou via des clés étrangères si elles sont exposées sur un type d’entité. Pour plus d’informations, consultez Propriété de clé étrangère.

Dans une application, une instance d'une association représente une association spécifique (par exemple une association entre une instance de Customer et des instances d'Order). Les instances d’association sont regroupées logiquement dans un ensemble d’associations. Les ensembles d’associations (et les jeux d’entités) sont regroupés logiquement dans un conteneur d’entités.

Propriété

Les types d’entité contiennent des propriétés qui définissent leur structure et leurs caractéristiques. Par exemple, un type d'entité Customer peut avoir des propriétés telles que CustomerId, Name et Address.

Les propriétés dans un modèle conceptuel sont analogues à celles définies sur une classe dans un logiciel. De même que les propriétés sur une classe définissent la forme de la classe et acheminent des informations sur les objets, les propriétés dans un modèle conceptuel définissent la forme d'un type d'entité et acheminent des informations sur les instances de type d'entité.

Une propriété peut contenir des données de type primitif (comme une chaîne, un entier ou une valeur booléenne) ou des données structurées (comme un type complexe). Pour plus d’informations, consultez Entity Data Model : Types de données primitifs.

Représentations d'un modèle conceptuel

Un modèle conceptuel est une représentation spécifique de la structure de certaines données sous forme d’entités et de relations. Un diagramme est une façon de représenter un modèle conceptuel. Le diagramme suivant représente un modèle conceptuel avec trois types d'entité (Book, Publisher et Author) et deux associations (PublishedBy et WrittenBy) :

Diagram showing a conceptual model with three entity types.

Toutefois, cette représentation présente des défauts en matière de transmission de détails sur le modèle. Par exemple, les informations sur le type de propriété et le jeu d'entités ne sont pas représentées sur le diagramme. La richesse d’un modèle conceptuel peut être transmise plus clairement dans un langage spécifique à un domaine (DSL). ADO.NET Entity Framework utilise un langage DSL basé sur XML appelé langage de définition de schéma conceptuel (CSDL, Conceptual Schema Definition Language) pour définir des modèles conceptuels. Voici la définition CSDL du modèle conceptuel dans le diagramme ci-dessus :

  <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm"
          xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration"
          xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
          Namespace="BooksModel" Alias="Self">
    <EntityContainer Name="BooksContainer" >
      <EntitySet Name="Books" EntityType="BooksModel.Book" />
      <EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
      <EntitySet Name="Authors" EntityType="BooksModel.Author" />
      <AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
        <End Role="Book" EntitySet="Books" />
        <End Role="Publisher" EntitySet="Publishers" />
      </AssociationSet>
      <AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
        <End Role="Book" EntitySet="Books" />
        <End Role="Author" EntitySet="Authors" />
      </AssociationSet>
    </EntityContainer>
    <EntityType Name="Book">
      <Key>
        <PropertyRef Name="ISBN" />
      </Key>
      <Property Type="String" Name="ISBN" Nullable="false" />
      <Property Type="String" Name="Title" Nullable="false" />
      <Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
      <NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
                          FromRole="Book" ToRole="Publisher" />
      <NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
                          FromRole="Book" ToRole="Author" />
    </EntityType>
    <EntityType Name="Publisher">
      <Key>
        <PropertyRef Name="Id" />
      </Key>
      <Property Type="Int32" Name="Id" Nullable="false" />
      <Property Type="String" Name="Name" Nullable="false" />
      <Property Type="String" Name="Address" Nullable="false" />
      <NavigationProperty Name="Books" Relationship="BooksModel.PublishedBy"
                          FromRole="Publisher" ToRole="Book" />
    </EntityType>
    <EntityType Name="Author">
      <Key>
        <PropertyRef Name="Name" />
        <PropertyRef Name="Address" />
      </Key>
      <Property Type="String" Name="Name" Nullable="false" />
      <Property Type="String" Name="Address" Nullable="false" />
      <NavigationProperty Name="Books" Relationship="BooksModel.WrittenBy"
                          FromRole="Author" ToRole="Book" />
    </EntityType>
<Association Name="PublishedBy">
      <End Type="BooksModel.Book" Role="Book" Multiplicity="*" />
      <End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
    </Association>
    <Association Name="WrittenBy">
      <End Type="BooksModel.Book" Role="Book" Multiplicity="*" />
      <End Type="BooksModel.Author" Role="Author" Multiplicity="*" />
    </Association>
  </Schema>

Voir aussi