- Accueil
- ASP.NET Core
- Identity
- Modifier le type de données des clés primaires dans ASP.NET Core Identity
Modifier le type de données des clés primaires dans ASP.NET Core Identity
Par défaut, toutes les clés primaires dans ASP.NET Core Identity sont des chaînes de caractères; pour être plus précis, il s'agit de Guid convertis en chaînes de caractères. Comme le signale Rick Anderson sur plusieurs échanges concernant ce sujet, cela s'explique parfaitement par le fait que Microsoft ne veut pas s'imiscer dans la logique métier des applications, or une chaîne de caractères est un champs très faiblement typé. Que les identifiants uniques des objets d'une application soient des nombres entier, ou d'un autre type de données ne les regarde pas.
Cela dit, beaucoup d'applications utilisent plutôt des nombres entiers ou des Guid pour leurs clés primaires, et par soucis de simplicité, de confort d'écriture et par soucis de cohérence, on aime aligner Identity sur ce comportement. Si cela pouvait être légèrement lourd sur les précédentes versions d'Identity, cette manipulation est devenue très simple à mettre en place sur la dernière version.
Voilà comment s'y prendre :
-
1
Surcharger les objets utilisateur et rôle, en leur passant le type de données souhaité pour leurs clés primaires (ici un Guid)
public class ApplicationUser : IdentityUser<Guid> { } public class ApplicationRole : IdentityRole<Guid> { }
-
2
Créer la classe pour le contexte, héritant du contexte Identity, en précisant là-encore le type de données souhaité pour les clés primaires :
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid> { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); // Customize the ASP.NET Identity model and override the defaults if needed. // For example, you can rename the ASP.NET Identity table names and more. // Add your customizations after calling base.OnModelCreating(builder); } }
-
3
Dans le point d'entrée de l'application (startup.cs), déclarer le service Identity avec les objets héritant des classes de base Identity et déclarant le type de données à utiliser :
public void ConfigureServices(IServiceCollection services) { // ... services.AddIdentity<ApplicationUser, ApplicationRole>() .AddEntityFrameworkStores<ApplicationDbContext, Guid>() .AddDefaultTokenProviders(); // ... }
Si ces modifications n'impactent pas le modèle de base de données, les clés primaires restant de type nvarchar(450), les identifiants des objets user et role au sein de l'application seront bien du type demandé, vous évitant ainsi de les caster à chaque utlisation :
[HttpGet]
public async Task<IActionResult> Test()
{
ApplicationUser user = await _userManager.GetUserAsync(HttpContext.User);
Guid userId = user.Id; // Aucun cast ici, il s'agit bien d'un guid
throw new NotImplementedException();
}