15-1 Migrations Identity
Les migrations suivantes pour créer les tables requises par Identity doivent être exécutées:
- application_users
- application_roles
- application_roles_users
Le nom de modèle suggéré par Identity est ApplicationUser
et ApplicationRole
. Les tables sont donc nommées en conséquence, mais techniquement rien n'empêcherait d'utiliser un nom différent.
Je vous "donne" ces migrations. En effet, si nous utilisions Entity Framework
, le tout serait créé automatiquement pour nous et on ne ferait qu'utiliser la librairie. On utilise une implémentation un peu personnalisée dans le cadre du cours pour fonctionner avec Dapper et Postgres et c'est pourquoi je vous donne les migrations.
Dans le cadre de votre projet, si vous utilisez autre chose que Prenom
ou Nom
pour identifier le nom de votre utilisateur (NomComplet
par exemple), vous devrez changer les migrations et les repositories.
Support PostgreSQL pour les GUID / UUID
Identity s'appuie sur une clé primaire de type GUID
/ UUID
pour la table utilisateurs. PostgreSQL supporte ce type de colonne, mais il faut activer une extension.
En effet, bien que le tout soit supporté, le support n'est pas activé par défaut. Il faut installer l'extension Postgres uuid-ossp
.
- Créez une nouvelle migration de base
AjouterExtensionUuidOssp
Snowfall.Data/Migrations/202502232119_AjouterExtensionUuidOssp.csusing FluentMigrator;
namespace Snowfall.Data.Migrations;
[Migration(202502232119)]
public class AjouterExtensionUuidOssp : Migration
{
public override void Up()
{
throw new NotImplementedException();
}
public override void Down()
{
throw new NotImplementedException();
}
} - Pour activer une extension Postgres, il faut exécuter du SQL brute. Il n'y a pas de dialecte FluentMigrator pour cela. Pour exécuter du SQL brut, il est possible d'utiliser
Execute.Sql
.public class AjouterExtensionUuidOssp : Migration
{
public override void Up()
{
Execute.Sql(
"""
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
"""
);
}
public override void Down()
{
Execute.Sql(
"""
DROP EXTENSION IF EXISTS "uuid-ossp"
"""
);
}
}
C'est tout, l'extension sera ajoutée lors de la prochaine migration!
Migration ApplicationUsers
La migration pour ApplicationUsers
permettra de créer la table qui contiendra les utilisateurs.
[Migration(202502232131)]
public class CreerApplicationUsers : Migration
{
public override void Up()
{
Create.Table("application_users")
.WithColumn("id").AsString(255).PrimaryKey()
.WithDefault(SystemMethods.NewGuid)
.WithColumn("username").AsString(255)
.WithColumn("normalized_username").AsString(255)
.WithColumn("email").AsString(255)
.WithColumn("normalized_email").AsString(255)
.WithColumn("email_confirmed").AsBoolean()
.WithColumn("password_hash").AsString(255)
.WithColumn("prenom").AsString(255)
.WithColumn("nom").AsString(255);
Create.Index("index_application_users_normalized_user_name")
.OnTable("application_users")
.OnColumn("normalized_username");
Create.Index("index_application_users_normalized_email")
.OnTable("application_users")
.OnColumn("normalized_username");
}
public override void Down()
{
Delete.Table("application_users");
}
}
Migration ApplicationRoles
[Migration(202502232133)]
public class CreerApplicationRoles : Migration
{
public override void Up()
{
Create.Table("application_roles")
.WithColumn("id").AsInt64().PrimaryKey().Identity()
.WithColumn("name").AsString(255)
.WithColumn("normalized_name").AsString(255);
Create.Index("index_application_roles_normalized_name")
.OnTable("application_roles")
.OnColumn("normalized_name");
}
public override void Down()
{
Delete.Table("application_roles");
}
}
Migration ApplicationRolesUsers
Cette table fait l'association entre les utilisateurs et les rôles (m:n)
[Migration(202502232138)]
public class CreerApplicationUsersRoles : Migration
{
public override void Up()
{
Create.Table("application_roles_users")
.WithColumn("role_id").AsInt64().PrimaryKey()
.WithColumn("user_id").AsString(255).PrimaryKey();
Create.ForeignKey()
.FromTable("application_roles_users").ForeignColumn("role_id")
.ToTable("application_roles").PrimaryColumn("id")
.OnDelete(Rule.Cascade);
Create.ForeignKey()
.FromTable("application_roles_users").ForeignColumn("user_id")
.ToTable("application_users").PrimaryColumn("id")
.OnDelete(Rule.Cascade);
}
public override void Down()
{
Delete.ForeignKey()
.FromTable("application_roles_users").ForeignColumn("user_id")
.ToTable("application_users").PrimaryColumn("id");
Delete.ForeignKey()
.FromTable("application_roles_users").ForeignColumn("role_id")
.ToTable("application_roles").PrimaryColumn("id");
Delete.Table("application_roles_users");
}
}