Définition d’une requête : EF Designer

Cette procédure pas à pas montre comment ajouter une requête de définition et un type d’entité correspondant à un modèle en utilisant EF Designer. Une requête de définition est généralement utilisée pour fournir des fonctionnalités semblables à celles fournies par une vue de base de données. Toutefois, la vue est définie dans le modèle et non dans la base de données. Une requête de définition vous permet d'exécuter une instruction SQL spécifiée dans l'élément DefiningQuery d'un fichier .edmx. Pour plus d’informations, consultez DefinitionQuery dans la spécification SSDL.

Lorsque vous utilisez la définition de requêtes, vous devez également définir un type d’entité dans votre modèle. Le type d’entité est utilisé pour exposer les données exposées par la requête de définition. Notez que les données surfacées via ce type d'entité sont en lecture seule.

Les requêtes paramétrées ne peuvent pas être exécutées en tant que requêtes de définition. Toutefois, les données peuvent être mises à jour en mappant les fonctions d'insertion, de mise à jour et de suppression du type d'entité qui surface les données aux procédures stockées. Pour plus d’informations, consultez Insertion, mise à jour et suppression avec des procédures stockées.

Cette rubrique décrit comment exécuter les tâches suivantes.

  • Ajouter une requête de définition
  • Ajouter un type d’entité au modèle
  • Mapper la requête de définition au type d’entité

Prérequis

Pour exécuter ce processus pas à pas, vous devez :

Configurer le projet

Cette procédure pas à pas utilise Visual Studio 2012 ou une version ultérieure.

  • Ouvrez Visual Studio.
  • Dans le menu Fichier , pointez sur Nouveau, puis cliquez sur Projet.
  • Dans le volet gauche, cliquez sur Visual C#, puis sélectionnez le modèle Application console.
  • Entrez DefiningQuerySample comme nom du projet, puis cliquez sur OK.

 

Créer un modèle basé sur la base de données School

  • Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, pointez sur Ajouter, puis cliquez sur Nouvel élément.

  • Sélectionnez Données dans le menu de gauche, puis sélectionnez ADO.NET Entity Data Model dans le menu des Modèles.

  • Entrez DefiningQueryModel.edmx pour le nom de fichier, puis cliquez sur Ajouter.

  • Dans la boîte de dialogue Choisir le contenu du Model, sélectionnez Générer à partir de la base de données, puis cliquez sur Suivant.

  • Cliquer sur Nouvelle connexion. Dans la boîte de dialogue Propriétés de connexion, entrez le nom du serveur (par exemple, (localdb)\mssqllocaldb), sélectionnez la méthode d'authentification, tapez School comme nom de base de données, puis cliquez sur OK. La boîte de dialogue Choisir votre connexion de données est mise à jour avec vos paramètres de connexion de base de données.

  • Dans la boîte de dialogue Choisir vos objets de base de données, cochez le nœud Tables . Cela ajoute toutes les tables au modèle School .

  • Cliquez sur Terminer.

  • Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le fichier DefiningQueryModel.edmx, puis sélectionnez Ouvrir avec....

  • Sélectionnez l’éditeur XML (texte).

    XML Editor

  • Cliquez sur Oui si vous y êtes invité avec le message suivant :

    Warning 2

 

Ajouter une requête de définition

Dans cette étape, nous allons utiliser l’éditeur XML pour ajouter une requête de définition et un type d’entité à la section SSDL du fichier .edmx. 

  • Ajoutez un élément EntitySet à la section SSDL du fichier .edmx (ligne 5 à 13). Spécifiez les informations suivantes :
    • Seuls les attributs Name et EntityType de l’élément EntitySet sont spécifiés.
    • Le nom qualifié complet du type d'entité est utilisé dans l'attribut EntityType.
    • L’instruction SQL à exécuter est spécifiée dans l’élément DefiningQuery .
    <!-- SSDL content -->
    <edmx:StorageModels>
      <Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
        <EntityContainer Name="SchoolModelStoreContainer">
           <EntitySet Name="GradeReport" EntityType="SchoolModel.Store.GradeReport">
              <DefiningQuery>
                SELECT CourseID, Grade, FirstName, LastName
                FROM StudentGrade
                JOIN
                (SELECT * FROM Person WHERE EnrollmentDate IS NOT NULL) AS p
                ON StudentID = p.PersonID
              </DefiningQuery>
          </EntitySet>
          <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" store:Type="Tables" Schema="dbo" />
  • Ajoutez l’élément EntityType à la section SSDL du .edmx. fichier comme indiqué ci-dessous. Notez ce qui suit :
    • La valeur de l’attribut Name correspond à la valeur de l’attribut EntityType dans l’élément EntitySet ci-dessus, bien que le nom complet du type d’entité soit utilisé dans l’attribut EntityType .
    • Les noms de propriétés correspondent aux noms de colonnes retournés par l'instruction SQL dans l'élément DefiningQuery (ci-dessus).
    • Dans cet exemple, la clé d'entité est composée de trois propriétés pour garantir le caractère unique de la valeur de la clé.
    <EntityType Name="GradeReport">
      <Key>
        <PropertyRef Name="CourseID" />
        <PropertyRef Name="FirstName" />
        <PropertyRef Name="LastName" />
      </Key>
      <Property Name="CourseID"
                Type="int"
                Nullable="false" />
      <Property Name="Grade"
                Type="decimal"
                Precision="3"
                Scale="2" />
      <Property Name="FirstName"
                Type="nvarchar"
                Nullable="false"
                MaxLength="50" />
      <Property Name="LastName"
                Type="nvarchar"
                Nullable="false"
                MaxLength="50" />
    </EntityType>

Remarque

Si vous exécutez ultérieurement la boîte de dialogue Assistant de mise à jour du modèle, toute modification apportée au modèle de stockage, notamment les requêtes de définition, sera remplacée.

 

Ajouter un type d’entité au modèle

Dans cette étape, nous allons ajouter le type d’entité au modèle conceptuel en utilisant EF Designer.  Notez ce qui suit :

  • Le nom de l’entité correspond à la valeur de l’attribut EntityType dans l’élément EntitySet ci-dessus.
  • Les noms de propriétés correspondent aux noms de colonnes retournés par l'instruction SQL dans l'élément DefiningQuery ci-dessus.
  • Dans cet exemple, la clé d'entité est composée de trois propriétés pour garantir le caractère unique de la valeur de la clé.

Ouvrez le modèle dans EF Designer.

  • Double-cliquez sur l’élément DefiningQueryModel.edmx.

  • Sélectionnez Oui au message suivant :

    Warning 2

 

Le Concepteur d'entités, qui fournit une aire de conception permettant de modifier votre modèle, est affiché.

  • Cliquez avec le bouton droit sur l’aire du concepteur, puis sélectionnez Ajouter une nouvelle->Entité….
  • Spécifiez GradeReport pour le nom de l’entité et CourseID pour la propriété clé.
  • Cliquez avec le bouton droit sur l’entité GradeReport , puis sélectionnez Ajouter une nouvelle->propriété scalaire.
  • Remplacez le nom par défaut de la propriété par FirstName.
  • Ajoutez une autre propriété scalaire et spécifiez LastName pour le nom.
  • Ajoutez une autre propriété scalaire et spécifiez Grade pour le nom.
  • Dans la fenêtrePropriétés changez la propriété de TypeGrade en décimale.
  • Sélectionnez les propriétés FirstName et LastName.
  • Dans la fenêtre Propriétés, remplacez la valeur de la propriété EntityKey par True.

Par conséquent, les éléments suivants ont été ajoutés à la section CSDL du fichier .edmx.

    <EntitySet Name="GradeReport" EntityType="SchoolModel.GradeReport" />

    <EntityType Name="GradeReport">
    . . .
    </EntityType>

 

Mapper la requête de définition au type d’entité

Dans cette étape, nous allons utiliser la fenêtre Détails du mappage pour mapper les types d’entités conceptuelles et de stockage.

  • Cliquez avec le bouton droit sur l’entité GradeReport sur l’aire de conception, puis sélectionnez Mappage de table.
    La fenêtre Détails du mappage s’affiche.
  • Sélectionnez GradeReport dans la liste déroulante <Ajouter une table ou une vue> (située sous Tables).
    Les mappages par défaut entre le type d’entité GradeReport conceptuel et de stockage s’affichent.
    Mapping Details3

Par conséquent, l’élément EntitySetMapping est ajouté à la section de mappage du fichier .edmx. 

    <EntitySetMapping Name="GradeReports">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.GradeReport)">
        <MappingFragment StoreEntitySet="GradeReport">
          <ScalarProperty Name="LastName" ColumnName="LastName" />
          <ScalarProperty Name="FirstName" ColumnName="FirstName" />
          <ScalarProperty Name="Grade" ColumnName="Grade" />
          <ScalarProperty Name="CourseID" ColumnName="CourseID" />
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
  • Compilez l’application.

 

Appeler la requête de définition dans votre code

Vous pouvez désormais exécuter la requête de définition à l’aide du type d’entité GradeReport

    using (var context = new SchoolEntities())
    {
        var report = context.GradeReports.FirstOrDefault();
        Console.WriteLine("{0} {1} got {2}",
            report.FirstName, report.LastName, report.Grade);
    }