A partire da EFCore 2.1 è possibile seminare dati utilizzando il metodo DbContext OnModelCreating.
https://docs.microsoft.com/en-us/ef/core/modeling/data-seeding
Tuttavia, la creazione di utenti / ruoli viene generalmente gestita da un UserManager / RoleManager.
Ora, posso creare manualmente un ruolo o un utente - ma per esempio nel caso di un utente ho bisogno di cancellare la password da solo (e non so quale metodo di hashing è usato da UserManager senza scavare nella fonte)
C'è un modo per aggirare questo? O dovrei restare con un metodo di seeding statico eseguito all'avvio come nelle versioni precedenti di Entity Framework Core?
Se si desidera utilizzare il metodo OnModelCreating
con il metodo HasData
, è possibile farlo in questo modo:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
ApplicationUser appUser = new ApplicationUser
{
UserName = "tester",
Email = "tester@test.com",
NormalizedEmail = "tester@test.com".ToUpper(),
NormalizedUserName = "tester".ToUpper(),
TwoFactorEnabled = false,
EmailConfirmed = true,
PhoneNumber = "123456789",
PhoneNumberConfirmed = false
};
PasswordHasher<ApplicationUser> ph = new PasswordHasher<ApplicationUser>();
appUser.PasswordHash = ph.HashPassword(appUser, "Your-PW1");
modelBuilder.Entity<IdentityRole>().HasData(
new IdentityRole { Name = "Admin", NormalizedName = "ADMIN" },
new IdentityRole { Name = "User", NormalizedName = "USER"}
);
modelBuilder.Entity<ApplicationUser>().HasData(
appUser
);
}
Se si crea l'utente al di fuori del metodo HasData
, è possibile utilizzare PasswordHasher
. Cancellerà la password per te. Quindi basta inserire l'utente creato in HasData
invece di crearne uno nuovo lì. Non so se sia meglio del seeding all'avvio, ma il suo unico modo per farlo.