Procédure : définir un modèle avec jeux d'entités multiples par type (Entity Framework)

Cette rubrique décrit comment créer un modèle conceptuel avec des jeux d'entités multiples par type (MEST). La définition de jeux d'entités multiples par type vous permet de rationaliser le code lorsque plusieurs tables de la base de données sous-jacente ont la même structure. Lorsque vous utilisez des types d'entité qui ne sont pas associés à d'autres types, la définition d'un modèle MEST est simple. Toutefois, pour définir un modèle MEST pour les types d'entité associés à d'autres types, vous devez implémenter le modèle MEST pour chaque type dans le graphique d'objet. Pour plus d'informations, consultez MEST - What is it and how does it work? (en anglais). Cette rubrique décrit comment définir un modèle MEST pour un type d'entité qui n'est pas associé à d'autres types.

Notez que vous ne devez implémenter un modèle MEST que lorsque les tables de la base de données sous-jacente ont la même structure.

Les principales étapes pour définir un modèle MEST sont les suivantes :

  1. Utilisez plusieurs éléments EntitySet (chacun possédant la même valeur de l'attribut EntityType ) pour définir des jeux d'entités multiples pour un type donné dans le modèle conceptuel.

  2. Mappez chaque jeu d'entités à la table appropriée dans le langage MSL (Mapping Specification Language). Pour plus d'informations, consultez Élément EntitySetMapping (MSL).

L'exemple suivant suppose que vous avez installé l'exemple de base de données suivant :

USE [master]
GO
CREATE DATABASE [TestDB] 
GO

SET QUOTED_IDENTIFIER OFF;
SET ANSI_NULLS ON;
GO

USE [TestDB]
GO

-- --------------------------------------------------
-- Create Tables
-- --------------------------------------------------

-- Creating table 'GraduateCourses'
CREATE TABLE [dbo].[GraduateCourses] (
    [GraduateCourseId] int  NOT NULL,
    [Title] nvarchar(max)  NOT NULL,
    [Credits] int  NOT NULL
);
GO
-- Creating table 'UnderGraduateCourses'
CREATE TABLE [dbo].[UnderGraduateCourses] (
    [UnderGraduateCourseId] int  NOT NULL,
    [Title] nvarchar(max)  NOT NULL,
    [Credits] int  NOT NULL
);
GO

-- --------------------------------------------------
-- Primary Key Constraints
-- --------------------------------------------------

-- Creating primary key in table 'GraduateCourses'
ALTER TABLE [dbo].[GraduateCourses] WITH NOCHECK 
ADD CONSTRAINT [PK_GraduateCourses]
    PRIMARY KEY CLUSTERED ([GraduateCourseId] ASC)
    ON [PRIMARY]
GO
-- Creating primary key in table 'UnderGraduateCourses'
ALTER TABLE [dbo].[UnderGraduateCourses] WITH NOCHECK 
ADD CONSTRAINT [PK_UnderGraduateCourses]
    PRIMARY KEY CLUSTERED ([UnderGraduateCourseId] ASC)
    ON [PRIMARY]
GO

L'exemple suppose également que vous avez configuré votre projet de manière à utiliser Entity Framework . Pour plus d'informations, consultez Configuration d'Entity Framework (Tâches Entity Framework).

Pour créer le modèle de stockage

  1. Ajoutez à votre projet le fichier XML suivant et nommez-le MEST.ssdl.

    - OU -

    Ajoutez un fichier .edmx vide (MEST.edmx) à votre projet et remplacez l'élément Schema sous l'élément edmx:StorageModels par l'élément Schema dans le fichier XML suivant. Pour plus d'informations, consultez How to: Create a New .edmx File et .edmx File Overview.

    Notez que les tables dans le modèle de stockage ont la même structure.

    <?xml version="1.0" encoding="utf-8" ?>
    <Schema Namespace="MEST.Store" Alias="Self" Provider="System.Data.SqlClient"
                ProviderManifestToken="2008"
                xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
                xmlns="https://schemas.microsoft.com/ado/2009/02/edm/ssdl">
      <EntityContainer Name="MESTStoreContainer">
        <EntitySet Name="GraduateCourses"
                   EntityType="MEST.Store.GraduateCourses"
                   store:Type="Tables" Schema="dbo" />
        <EntitySet Name="UnderGraduateCourses"
                   EntityType="MEST.Store.UnderGraduateCourses"
                   store:Type="Tables" Schema="dbo" />
      </EntityContainer>
      <EntityType Name="GraduateCourses">
        <Key>
          <PropertyRef Name="GraduateCourseId" />
        </Key>
        <Property Name="GraduateCourseId" Type="int" Nullable="false" />
        <Property Name="Title" Type="nvarchar(max)" Nullable="false" />
        <Property Name="Credits" Type="int" Nullable="false" />
      </EntityType>
      <EntityType Name="UnderGraduateCourses">
        <Key>
          <PropertyRef Name="UnderGraduateCourseId" />
        </Key>
        <Property Name="UnderGraduateCourseId" Type="int" Nullable="false" />
        <Property Name="Title" Type="nvarchar(max)" Nullable="false" />
        <Property Name="Credits" Type="int" Nullable="false" />
      </EntityType>
    </Schema>
    

Pour créer le modèle conceptuel

  1. Ajoutez à votre projet le fichier XML suivant et nommez-le MEST.csdl.

    - OU -

    Dans votre fichier .edmx, remplacez l'élément Schema dans l'élément edmx:ConceptualModels par l'élément Schema dans le fichier XML suivant.

    Notez que deux jeux d'entités ont été définis pour le type d'entité Course.

    <?xml version="1.0" encoding="utf-8" ?>
    <Schema xmlns="https://schemas.microsoft.com/ado/2008/09/edm"
                  xmlns:cg="https://schemas.microsoft.com/ado/2006/04/codegeneration"
                  xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
                  Namespace="MEST" Alias="Self"
                  xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation">
      <EntityContainer Name="MESTContainer" annotation:LazyLoadingEnabled="true">
        <EntitySet Name="GraduateCourses" EntityType="MEST.Course" />
        <EntitySet Name="UnderGraduateCourses" EntityType="MEST.Course" />
      </EntityContainer>
      <EntityType Name="Course">
        <Key>
          <PropertyRef Name="CourseId" />
        </Key>
        <Property Type="Int32" Name="CourseId" Nullable="false" />
        <Property Type="String" Name="Title" Nullable="false" />
        <Property Type="Int32" Name="Credits" Nullable="false" />
      </EntityType>
    </Schema>
    

Pour définir le mappage entre le modèle conceptuel et le modèle de stockage.

  1. Ajoutez à votre projet le fichier XML suivant et nommez-le MEST.msl.

    - OU -

    Dans votre fichier .edmx, remplacez l'élément Mapping dans l'élément edmx:Mappings par l'élément Mapping dans le fichier XML suivant.

    Notez que chaque jeu d'entités est mappé à la base de données sous-jacente appropriée.

    <?xml version="1.0" encoding="utf-8" ?>
    <Mapping Space="C-S"
                 xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs">
      <EntityContainerMapping StorageEntityContainer="MESTStoreContainer"
                              CdmEntityContainer="MESTContainer">
        <EntitySetMapping Name="GraduateCourses">
          <EntityTypeMapping TypeName="IsTypeOf(MEST.Course)">
            <MappingFragment StoreEntitySet="GraduateCourses">
              <ScalarProperty Name="CourseId" ColumnName="GraduateCourseId" />
              <ScalarProperty Name="Title" ColumnName="Title" />
              <ScalarProperty Name="Credits" ColumnName="Credits" />
            </MappingFragment>
          </EntityTypeMapping>
        </EntitySetMapping>
        <EntitySetMapping Name="UnderGraduateCourses">
          <EntityTypeMapping TypeName="IsTypeOf(MEST.Course)">
            <MappingFragment StoreEntitySet="UnderGraduateCourses">
              <ScalarProperty Name="CourseId" ColumnName="UnderGraduateCourseId" />
              <ScalarProperty Name="Title" ColumnName="Title" />
              <ScalarProperty Name="Credits" ColumnName="Credits" />
            </MappingFragment>
          </EntityTypeMapping>
        </EntitySetMapping>
      </EntityContainerMapping>
    </Mapping>
    

Voir aussi

Autres ressources

Spécifications CSDL, SSDL et MSL
Définition de modèles de données avancés (Tâches Entity Framework)
ADO.NET Entity Data Model Tools