Aller au contenu principal

Conventions PG, Migrations et Seeders

Conventions de nommage PostgreSQL

ConventionExemple
Table- Minuscule
- Snake case
- Pluriel
- evenements
- commentaires
- application_users
Colonne- Minuscule
- Snake case
- Singulier
- id
- evenement_id
- nom_complet
Table pivot- Minuscule
- table1pluriel_table2pluriel
- Ordre alphabétique
- evenements_types
- inscriptions_utilisateurs

Migrations

Créer une migration

[Migration(202301311649)]
public class CreerVilles : Migration
{
public override void Up()
{
Create.Table("villes")
.WithColumn("id").AsInt64().PrimaryKey().Identity()
.WithColumn("nom").AsString()
.WithColumn("pays_iso").AsString(2);
}

public override void Down()
{
Delete.Table("villes");
}
}
  1. Créer une classe. Créer une classe sous le projet Data, dossier Migrations.

  2. Nommer la classe. Nommez la classe selon le format:

    • Creer[NomDeLaTableAuPluriel]
    • AjouterColonneA[NomDeLaTable]

    Pour tout autre besoin, utiliser le verbe Creer ou Ajouter suivi de l'action.

  3. Ajouter l'attribut [Migration] et hériter de la classe Migration. Versionnez la migration à l'aide de l'attribut [Migration], puis faites là hériter de Migration.

    [Migration(202302041311)]
    public class CreerEvenements : Migration

    Versionnez selon le format YYYMMDDHHMM.

  4. Changez le nom du fichier pour ajouter comme préfixe la version. Par exemple 202302041311_CreerEvenements.cs.

  5. Définissez les fonctions:

    • public override void Up()
    • public override void Down()

Créer une table

Create.Table("nom_de_la_table")

Créer une colonne

Lors de la création de la table

Create.Table("nom_de_la_table")
.WithColumn("nom_de_la_colonne")

Ajouter une colonne à une table existante

Create.Column("ville_id")
.OnTable("evenements")
.AsInt64();
  • Create.Column(): Création de la colonne et de son nom
  • OnTable: Table pour laquelle créer la colinne
  • AsInt64(): Définir le type via les fonctions As.

Définir le Type d'une colonne

Create.Table("nom_de_la_table")
.WithColumn("nom_de_la_colonne")
.AsString()
  • AsString(): Défini un type string/text/varchar. Il existe plusieurs fonctions As.

Définir une clé primaire

Create.Table("villes")
.WithColumn("id").AsInt64().PrimaryKey().Identity()
  1. PrimaryKey(): La colonne sera une clé primaire
  2. Identity(): La colonne sera gérée et auto incrémentée par la BD

Définir une clé étrangère

Create.ForeignKey()
.FromTable("commentaires").ForeignColumn("evenement_id")
.ToTable("evenements").PrimaryColumn("id");
  • FromTable: Table qui contient la FK (référence vers une autre table)
  • ForeignColumn: Nom de la colonne dans la table qui contient la FK
  • ToTable: Nom de la table vers laquelle on fait une référence
  • PrimaryColumn: Nom de la colonne vers laquelle on veut faire référence

Exécuter les migrations

Dans Program.cs:

app.Services.MigrateUp();

Réinitialiser les migrations

Dans Program.cs, exécuter MigrateDown() et ensuite MigrateUp()

app.Services.MigrateDown();
app.Services.MigrateUp();

Réinitialiser via la BD directement.

Vous pouvez aussi vider manuellement (ex.: Via DataGrip) le contenu de la base de données en supprimant les différentes tables

Seeders

Créer un seed

Pour créer un seed, créez simplement une nouvelle migration avec un numéro de version après la table concernée.

Insérer des données (Up)

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"
});
}

Supprimer des données (Down)

public override void Down()
{
Delete.FromTable("villes").AllRows();
}

Insérer des données relationnelles

Vous devez malheureusement coder en dur les id auxquels vous devez faire référence. Utilisez des enum au besoin pour rendre le tout plus propre.

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,
});
}

//...