5-11 Oops, colonne ville_id
Oopsy... on a oublié la colonne ville_id
dans la migration de la table evenements
.
On pourrait revenir en arrière (MigrateDown()
), modifier la classe CreerEvenements
et réexécuter les migrations (MigrateUp()
), mais quelle belle occasion pour montrer qu'il est possible de créer une migration pour ajouter la colonne manquante! 😉
-
Sous le dossier
Migrations
, dans le projetSnowfall.Data
, créez une nouvelle classe pour la migration N'oubliez pas de nommer le fichier et la version selon la convention YYYYMMDDHHMM.Snowfall.Data/Migrations/202302041343_AjouterColonneVilleAEvenements.csusing FluentMigrator;
namespace Snowfall.Data.Migrations;
[Migration(202302041343)]
public class AjouterColonneVilleAEvenements : Migration
{
public override void Up()
{
// Up
}
public override void Down()
{
// Down
}
} -
Créer la colonne. À l'image de
Create.Table()
, on il existeCreate.Column()
, fonction pour laquelle on peut ensuite préciser sur quelle table viaOnTable()
:public override void Up()
{
Create.Column("ville_id")
.OnTable("evenements")
.AsInt64();
} -
Créer la FK. Pour créer la clé étrangère, une fonction
Create.ForeignKey()
est disponible.public override void Up()
{
Create.Column("ville_id")
.OnTable("evenements")
.AsInt64();
Create.ForeignKey()
.FromTable("evenements").ForeignColumn("ville_id")
.ToTable("villes").PrimaryColumn("id");
}infoIl est nécessaire de préciser
FromTable()
etForeignColumn()
, puisToTable()
etPrimaryColumn()
afin d'identifier la contrainte de clé étrangère.astuceUne fonction de migration
Up()
ouDown()
peut contenir plusieurs instructions. Ici, on crée la colonne et ensuite la clé étrangère. -
Fonction
Down()
. Pour compléter la migration, la fonctionDown()
doit premièrement supprimer la contrainte de clé étrangère, puis ensuite supprimer la colonne. En effet, on effectue les opérations dans l'ordre inverse de la création. Si on essaie de supprimer la colonne, cela génèrera une erreur puisque cela briserait la contrainte de clé étrangère.public override void Down()
{
Delete.ForeignKey()
.FromTable("evenements").ForeignColumn("ville_id")
.ToTable("villes").PrimaryColumn("id");
Delete.Column("ville_id").FromTable("evenements");
}infoLa syntaxe est exactement la même que pour
Up()
, mais on utiliseDelete
plutôt queCreate
.
Lancer le projet
Lancez le projet et dans la console Debug
, vous pourrez remarquer:
-------------------------------------------------------------------------------
202302041343: AjouterColonneVilleAEvenements migrating
-------------------------------------------------------------------------------
info: FluentMigrator.Runner.Processors.Postgres.PostgresProcessor[1004]
Beginning Transaction
Beginning Transaction
info: FluentMigrator.Runner.MigrationRunner[1004]
//highlight-next-line
CreateColumn evenements ville_id Int64
CreateColumn evenements ville_id Int64
info: FluentMigrator.Runner.Processors.Postgres.PostgresProcessor[1003]
//highlight-next-line
ALTER TABLE "public"."evenements" ADD "ville_id" bigint NOT NULL;
info: FluentMigrator.Runner.MigrationRunner[1002]
=> 0.011876s
info: FluentMigrator.Runner.MigrationRunner[1004]
//highlight-next-line
CreateForeignKey FK_evenements_ville_id_villes_id evenements(ville_id) villes(id)
CreateForeignKey FK_evenements_ville_id_villes_id evenements(ville_id) villes(id)
info: FluentMigrator.Runner.Processors.Postgres.PostgresProcessor[1003]
//highlight-next-line
ALTER TABLE "public"."evenements" ADD CONSTRAINT "FK_evenements_ville_id_villes_id" FOREIGN KEY ("ville_id") REFERENCES "public"."villes" ("id");
info: FluentMigrator.Runner.MigrationRunner[1002]
=> 0.01294s
info: FluentMigrator.Runner.Processors.Postgres.PostgresProcessor[1003]
INSERT INTO "public"."VersionInfo" ("Version","AppliedOn","Description") VALUES (202302041343,'2023-02-04T18:59:13','AjouterColonneVilleAEvenements');
info: FluentMigrator.Runner.Processors.Postgres.PostgresProcessor[1004]
Committing Transaction
Committing Transaction
202302041343: AjouterColonneVilleAEvenements migrated
Dans un premier temps, la colonne ville_id
est créée, ensuite la clé étrangère et finalement la contrainte sont appliquées.
Remarquez que le nom de la contrainte est automatiquement nommé FK_evenements_ville_id_villes_id
sans que nous ayons eu à préciser quoi que ce soit.
Le format de FK par défaut dans Postgres est FK_[table]_[colonne FK]_[colonne clé primaire]
.