6-1 Créer et exécuter des seeds
En FluentMigrator
, un seed
est une migration. C'est-à-dire que l'insertion des données se fait à même les fichiers de migration et ces derniers sont exécutés au même moment.
Il y a quelques façons d'intégrer ces derniers à votre projet, mais de notre côté, nous allons simplement créer des fichiers séparés, associés aux migrations pertinentes.
Créer un fichier de Seed
Créer un seed pour les villes
Dans un premier temps, imaginons que nous voulions insérer des données de test pour les villes. Insérer quelques villes prédéfinies dans la base de données bref.
Cette insertion de données doit se faire après la migration responsable de créer la table villes
. En effet, il faut que la table existe avant d'insérer des données 😉
- Créer une classe sous le dossier
Migrations
et nommez laSeedVilles
- Renommez le fichier avec un numéro de migration, mais assurez-vous de lui donner un numéro de migration qui la positionne entre
CreerVilles
etCreerEvemenents
de cette façon: - Créez ensuite la base d'une migration normale,
Snowfall.Data/Migrations/202501310930_SeedVilles.cs
using FluentMigrator;
namespace Snowfall.Data.Migrations;
[Migration(202501310930)]
public class SeedVilles : Migration
{
public override void Up()
{
throw new NotImplementedException();
}
public override void Down()
{
throw new NotImplementedException();
}
}
Insérer des données
On peut ensuite procéder à une insertion de données de la façon suivante:
using FluentMigrator;
namespace Snowfall.Data.Migrations;
[Migration(202501310930)]
public class SeedVilles : Migration
{
public override void Up()
{
Insert.IntoTable("villes").Row(new
{
nom = "Vegas, NV",
pays_iso = "US"
});
Insert.IntoTable("villes").Row(new
{
nom = "Montreal, QC",
pays_iso = "CA"
});
}
public override void Down()
{
throw new NotImplementedException();
}
}
Version Down()
Pour un seed de données, la fonction Down()
représente simplement la suppression de toutes les entrées!
Il est possible de faire cela facilement avec FluentMigrator.
public override void Down()
{
Delete.FromTable("villes").AllRows();
}
Insérer des données relationnelles
Imaginons que nous voulions insérer des données relationnelles, comme par exemple un événement qui est lié à une ville.
Pour cela, on doit spécifier manuellement les id. Il serait préférable de pouvoir obtenir une référence aux différents id des villes insérés et ensuite de pouvoir les utiliser, mais cela est malheureusement une limitation de FluentMigrator.
On peut cependant assumer que la première entrée insérée d'une table aura le id 1, ensuite 2 et ainsi de suite.
Donc, nous pourrions faire quelque chose comme ceci:
-
Créer une nouvelle migration
SeedEvenements
-
Renommez le fichier avec un numéro de version qui positionnera la migration à la toute fin, soit après
AjouterColonneVilleAEvenements
-
Créez une migration de base
Snowfall.Data/Migrations/202502041517_SeedEvenements.csusing FluentMigrator;
namespace Snowfall.Data.Migrations;
[Migration(202502041517)]
public class SeedEvenements : Migration
{
public override void Up()
{
throw new NotImplementedException();
}
public override void Down()
{
throw new NotImplementedException();
}
} -
Ajouter l'insertion de données dans la fonction
Up()
Snowfall.Data/Migrations/202502041517_SeedEvenements.csusing FluentMigrator;
namespace Snowfall.Data.Migrations;
[Migration(202502041517)]
public class SeedEvenements : Migration
{
public override void Up()
{
Insert.IntoTable("evenements").Row(new
{
nom = "What happens in Vegas",
description = "Stays in Vegas",
prix = 30.00,
capacite = 4000,
date = DateTime.Now,
ville_id = 1,
});
}
public override void Down()
{
Delete.FromTable("evenements").AllRows();
}
}infoRemarquez la ligne
ville_id = 1
, c'est à cette ligne que le lien avec la ville est fait de façon manuelle.
Utiliser un enum
Pour rendre le tout plus propre, vous pourriez utiliser des enum
référençant les différents id
attendus. Par exemple:
[Migration(202502041517)]
public class SeedEvenements : Migration
{
private enum Villes
{
Vegas = 1,
}
public override void Up()
{
Insert.IntoTable("evenements").Row(new
{
nom = "What happens in Vegas",
description = "Stays in Vegas",
prix = 30.00,
capacite = 4000,
date = DateTime.Now,
ville_id = (int) Villes.Vegas,
});
}
//...