• 6 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 18/04/2023

Créez une base de données avec C# et les migrations code first

Modélisez votre base de données

Vous avez étudié le design pattern MVC, et plus particulièrement la façon dont la partie modèle de ce pattern peut être liée à une base de données. Un modèle de données est composé de classes C# et d’un contexte de base de données (objet) qui représente une connexion ou une session avec celle-ci. Cet objet sert à accéder à la base de données pour lire et écrire des données.

J’ai mentionné dans la vidéo ci-dessus qu’il était possible de créer une base de données à partir de votre modèle en s’aidant des migrations code first et vice versa en utilisant l’intégration database first. Dans ce chapitre, nous allons utiliser EF Core ainsi que les migrations code first pour créer une base de données. Pour cela, nous allons devoir créer un modèle.

Pour que vous compreniez plus facilement, j’ai pensé concevoir un modèle pour un simple catalogue de recettes. Voici quelques questions que nous pouvons nous poser :

Comment vais-je organiser mes recettes ? Sous la forme d’une grande liste ? Classées par catégorie ou par origine des recettes ? Des deux façons ? D’une autre manière ?

J’ai conçu un modèle préliminaire. Cependant, il existe d’autres façons de créer des modèles et d’améliorer celui-ci. L’objectif de ce modèle est de fournir une base pour notre apprentissage des migrations code first en vue de générer une base de données relationnelle. Il constitue également une base pour tous les exemples et exercices de code que nous ferons dans la suite du cours. Vous devrez utiliser ce modèle pour réaliser tous les exercices, mais vous pouvez également en créer un autre si vous le souhaitez, en utilisant simplement une autre application. Vous pouvez adapter les exercices à un autre modèle, mais vous devrez vous-même créer les données.

Voici le modèle avec lequel nous allons commencer :

Le modèle entité-association de notre modèle de données
Le modèle entité-association de notre modèle de données
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
 base.OnModelCreating(modelBuilder);
   modelBuilder.Entity<IngredientRecette>()
      .HasKey(t => new { t.RecetteId, t.IngredientId });
}

Codez le modèle

Le modèle entité-association ci-dessus présente les classes que nous allons utiliser :

  • Recette

  • Ingredient

  • IngredientRecette

  • TypeAliment

  • OrigineAliment

  • UniteDeMesure

Alors, commençons par ceux-ci et nous verrons comment procéder ensuite :

Créez un nouveau projet MVC dans Visual Studio et nommez-le MesRecettes.

En partant du principe que vous souhaitez que vos recettes restent privées, définissez le type d’authentification sur Comptes individuels.

Ensuite, créez une classe Recette dans le dossier models. Ajoutez-y les attributs conformément à notre modèle entité-association ci-dessus.

Vous devriez avoir quelque chose de similaire à ceci :

public class Recette
{
 public int Id { get; set; }
 public string Nom { get; set; }
 public int TemperatureDeCuisson { get; set; }
 public int TempsDeCuisson { get; set; }
 public string Instructions { get; set; }
 public int TypeAlimentId { get; set; }
 public int OrigineAlimentId { get; set; }
 
  public virtual TypeAliment TypeAliment { get; set; }
 public virtual OrigineAliment OrigineAliment { get; set; }
   public virtual ICollection<IngredientRecette> RecetteIngredients {
      get; set; }
}

Exercice de code : complétez le modèle

Créez par vous-même le reste des classes du modèle. Une fois que vous aurez créé toutes ces classes, vous pourrez continuer la migration.

Effectuez la migration

Avant d’effectuer la migration, vous devez vous assurer que les informations contenues dans la chaîne de connexion de la base de données sont exactes. Si vous avez déjà installé SQL Server Management Studio (SSMS), vous avez déjà configuré votre serveur LocalDB. Vous devez juste vous assurer de changer la référence du serveur dans la chaîne de configuration pour qu’elle corresponde au nom de votre serveur. Je vous montrerai dans un instant où se trouve cette référence.

Si vous n’avez pas encore installé SSMS, faites-le maintenant avant de poursuivre ce chapitre. Pendant l’installation, il vous sera demandé de nommer votre instance locale de SQL Server. Vous ferez référence à ce nom dans la chaîne de configuration.

Dans VS 2017 et EF 6, les chaînes de configuration de votre base de données se trouvaient dans le fichier Web.config situé dans le dossier racine de votre projet. Depuis EF Core et VS 2019, les chaînes de connexion se trouvent dans le fichier appsettings.json, toujours dans le dossier racine de votre projet.

Retrouvez le fichier appsettings.json
Retrouvez le fichier appsettings.json

La chaîne de connexion dans le fichier ressemble à ceci (j’ai séparé la chaîne pour plus de clarté ici. NE faites PAS cela dans votre code, car cela rendrait la chaîne non valide) :

"ConnectionStrings": {
   "DefaultConnection": 
      "Server=(localdb)\\mssqllocaldb;
      Database=aspnet-MesRecettes-05FBD0B2-D66C-44FE-8A91-BB54D9A51A51;
      Trusted_Connection=True;
      MultipleActiveResultSets=true"
},

Les deux éléments sur lesquels je souhaite attirer votre attention sont le serveur et la base de données. En ce qui concerne le serveur, vous pouvez laisser le LocalDB si vous le souhaitez. Vous pouvez également le changer pour qu’il corresponde à une autre instance de serveur locale nommée que vous avez peut-être configurée pendant l’installation de SQL Server.

"ConnectionStrings": {
   "DefaultConnection": 
      "Server=(localdb)\\mssqllocaldb;
      Database=MesRecettesDB;
      Trusted_Connection=True;
      MultipleActiveResultSets=true"
 },

Remarquez que j’ai changé le nom de la base de données en MesRecettesDB. Le nom par défaut était trop long à mon goût.

Dans VS 2017 et EF 6, il est nécessaire d’activer manuellement les migrations avant de pouvoir effectuer une migration code first. Cela se faisait avec la commande enable-migrations dans la fenêtre de la console du gestionnaire de packages.

Cependant, avec EF Core et VS 2019, la commande enable-migrations est obsolète. Les migrations sont activées par défaut. Tout ce que vous avez à faire est d’ajouter une migration.

Vous obtiendrez des instructions supplémentaires si vous saisissez la commande add-migration dans la console du gestionnaire de packages et appuyez sur Entrée. Nommez chaque migration. Cela permet de conserver une trace de vos migrations, au cas où vous devriez revenir à une version antérieure. C’est en quelque sorte un contrôle de version pour votre modèle.

Ajouter une migration dans la console du gestionnaire de packages
Ajouter une migration dans la console du gestionnaire de packages

Vous pouvez ajouter les migrations de cette façon ou vous pouvez inclure le nom de la migration dans la commande :  add-migration MigrationInitiale .  En cas d’erreurs pendant la migration, c’est qu’elles proviennent probablement du code de votre modèle. Essayez de les repérer et de les corriger. Si vous êtes bloqué, reportez-vous au code de la section 4 à la fin de ce chapitre. 

Je n’ai reçu aucune erreur lors de ma migration initiale (rappelez-vous ce qui est indiqué dans la vidéo, il faut utiliser la commande Update-Database), j’ai donc une nouvelle base de données qui correspond à mon modèle. Si vous souhaitez vérifier votre base de données dans Visual Studio, vous pouvez le faire en ouvrant la fenêtre SQL Server Object Explorer. Pour ce faire, sélectionnez Affichage > Explorateur d’objets SQL Server. Recherchez votre serveur et développez son contenu. Votre base de données de recettes qui vient d’être créée devrait apparaître sous le dossier Bases de données. 

Aperçu du résultat de la migration
Aperçu du résultat de la migration

Le dossier Tables contient toutes les tables créées à partir de votre modèle de données. Certaines tables correspondent aux classes que vous avez conçues et codées, et les autres sont des tables que vous n’avez pas créées. Ces dernières portent le préfixe AspNet. Elles sont toutes créées par .NET Identity à l’aide d’Entity Framework pour gérer les comptes d’utilisateurs individuels. En effet, il s’agit de l’option que vous avez sélectionnée lors de la création du projet. Laissez-les tranquilles pour l’instant. Vous pourrez les utiliser plus tard si vous le souhaitez.

Examinez chacune des tables correspondant aux classes de votre modèle de données et assurez-vous que les noms des colonnes correspondent aux propriétés. Vous devriez voir une correspondance directe.

En résumé

Votre objectif avec ce chapitre consistait à générer une nouvelle base de données pour votre application de recettes en utilisant les migrations code first, que vous avez vues précédemment dans votre classe MVC. La migration scanne les classes C# de votre modèle de données et, associée à votre ORM (Entity Framework), les utilise pour construire les tables et les relations correspondantes dans votre base de données.

Pour ce faire, vous avez :

  1. construit un modèle de données pour stocker, rechercher et récupérer des recettes ;

  2. configuré la chaîne de connexion dans le fichier appsettings.json pour que votre application puisse trouver et se connecter en toute sécurité à la base de données ;

  3. modifié la classe de contexte de base de données, ApplicationDbContext , avec des objets de définition  DbSet  qui indiquent comment les tables de la base de données doivent être construites et mappées en utilisant les classes du modèle ;

  4. ajouté une migration initiale en utilisant la console du gestionnaire de packages (PMC = Package Manager Console) ;

  5. utilisé de la commande  update-database   dans la console PMC pour effectuer la migration ;

  6. utilisé l’explorateur d’objets SQL Server dans Visual Studio pour vous connecter à LocalDB. Vous avez localisé votre nouvelle base de données et validé sa création à partir du modèle.

Vous avez déjà fait un sacré travail, mais nous ne faisons que commencer. Dans le chapitre 4, vous apprendrez à exécuter des requêtes SQL sur votre nouvelle base de données, en utilisant à la fois le SQL brut et LINQ à partir du code C# de votre application MVC. 

Code source de l’exercice de codage

Après avoir effectué l’exercice donné au milieu du chapitre ci-dessus, comparez votre travail avec les exemples de classes ci-dessous :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace MesRecettes.Models
{
   public class Recette
   {
 public int Id { get; set; }
 public string Nom { get; set; }
 public int TemperatureDeCuisson { get; set; }
 public int TempsDeCuisson { get; set; }
 public string Instructions { get; set; }
 public int TypeAlimentId { get; set; }
 public int OrigineAlimentId { get; set; }

 public virtual TypeAliment TypeAliment { get; set; }
 public virtual OrigineAliment OrigineAliment { get; set; }
      public virtual ICollection<IngredientRecette> RecetteIngredients
         { get; set; }
   }
   public class Ingredient
   {
 public int Id { get; set; }
 public string Nom { get; set; }
 public double Quantite { get; set; }
 public int? UniteDeMesureId { get; set; }

 public virtual UniteDeMesure UniteDeMesure { get; set; }
      public virtual ICollection<IngredientRecette> IngredientRecettes 
         { get; set; }
   }

   public class IngredientRecette
   {
 public int RecetteId { get; set; }
 public int IngredientId { get; set; }

 public virtual Recette Recette { get; set; }
 public virtual Ingredient Ingredient { get; set; }
   }

   public class TypeAliment
   {
 public int Id { get; set; }
 public string Nom { get; set; }
   }

   public class OrigineAliment
   {
 public int Id { get; set; }
 public string Nom { get; set; }
   }

   public class UniteDeMesure
   {
 public int Id { get; set; }
 public string Nom { get; set; }
   }
}
Exemple de certificat de réussite
Exemple de certificat de réussite