Esta es la solución más completa que encomtrarás compartir, sin embargo estúdiala detenidamente y valora si es compatible a tu trabajo.
Solución:
Mi forma de hacer esto es crear una clase en el espacio de nombres de los modelos.
public class SampleData
public static void Initialize(IServiceProvider serviceProvider)
var context = serviceProvider.GetService();
string[] roles = new string[] "Owner", "Administrator", "Manager", "Editor", "Buyer", "Business", "Seller", "Subscriber" ;
foreach (string role in roles)
var roleStore = new RoleStore(context);
if (!context.Roles.Any(r => r.Name == role))
roleStore.CreateAsync(new IdentityRole(role));
var user = new ApplicationUser
FirstName = "XXXX",
LastName = "XXXX",
Email = "[email protected]",
NormalizedEmail = "[email protected]",
UserName = "Owner",
NormalizedUserName = "OWNER",
PhoneNumber = "+111111111111",
EmailConfirmed = true,
PhoneNumberConfirmed = true,
SecurityStamp = Guid.NewGuid().ToString("D")
;
if (!context.Users.Any(u => u.UserName == user.UserName))
var password = new PasswordHasher();
var hashed = password.HashPassword(user,"secret");
user.PasswordHash = hashed;
var userStore = new UserStore(context);
var result = userStore.CreateAsync(user);
AssignRoles(serviceProvider, user.Email, roles);
context.SaveChangesAsync();
public static async Task AssignRoles(IServiceProvider services, string email, string[] roles)
UserManager _userManager = services.GetService>();
ApplicationUser user = await _userManager.FindByEmailAsync(email);
var result = await _userManager.AddToRolesAsync(user, roles);
return result;
Para ejecutar este código en el inicio. En Startup.cs, al final del método de configuración, justo después de la configuración de la ruta, agregue el siguiente código como dijo Stafford Williams anteriormente.
SampleData.Initialize(app.ApplicationServices);
En el momento de escribir este artículo, no hay ningún complemento para sembrar la base de datos, pero puede crear una clase y agregarla a su contenedor para hacer lo mismo al iniciar la aplicación, así es como lo hice, primero crear una clase:
public class YourDbContextSeedData
{
private YourDbContext _context;
public YourDbContextSeedData(YourDbContext context)
_context = context;
public async void SeedAdminUser()
var user = new ApplicationUser
UserName = "[email protected]",
NormalizedUserName = "[email protected]",
Email = "[email protected]",
NormalizedEmail = "[email protected]",
EmailConfirmed = true,
LockoutEnabled = false,
SecurityStamp = Guid.NewGuid().ToString()
;
var roleStore = new RoleStore(_context);
if (!_context.Roles.Any(r => r.Name == "admin"))
await roleStore.CreateAsync(new IdentityRole Name = "admin", NormalizedName = "admin" );
if (!_context.Users.Any(u => u.UserName == user.UserName))
var password = new PasswordHasher();
var hashed = password.HashPassword(user, "password");
user.PasswordHash = hashed;
var userStore = new UserStore(_context);
await userStore.CreateAsync(user);
await userStore.AddToRoleAsync(user, "admin");
await _context.SaveChangesAsync();
Registre el tipo en ConfigureServices
método de tu Startup.cs
clase:
services.AddTransient();
Siguiente pase el YourDbContextSeedData
clase a la Configure
método de tu Startup.cs
class y úsala:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, YourDbContextSeedData seeder)
seeder.SeedAdminUser();
Puede sembrar usuarios y roles en el método OnModelCreating () dentro del archivo IdentityDbContext.cs como se muestra a continuación. Note que el keys deben estar predefinidos para evitar sembrar nuevos usuarios y roles cada vez que se ejecuta este método.
protected override void OnModelCreating(ModelBuilder modelBuilder)
base.OnModelCreating(modelBuilder);
//Seeding a 'Administrator' role to AspNetRoles table
modelBuilder.Entity().HasData(new IdentityRole Id = "2c5e174e-3b0e-446f-86af-483d56fd7210", Name = "Administrator", NormalizedName = "ADMINISTRATOR".ToUpper() );
//a hasher to hash the password before seeding the user to the db
var hasher = new PasswordHasher();
//Seeding the User to AspNetUsers table
modelBuilder.Entity().HasData(
new IdentityUser
Id = "8e445865-a24d-4543-a6c6-9443d048cdb9", // primary key
UserName = "myuser",
NormalizedUserName = "MYUSER",
PasswordHash = hasher.HashPassword(null, "Pa$$w0rd")
);
//Seeding the relation between our user and role to AspNetUserRoles table
modelBuilder.Entity>().HasData(
new IdentityUserRole
RoleId = "2c5e174e-3b0e-446f-86af-483d56fd7210",
UserId = "8e445865-a24d-4543-a6c6-9443d048cdb9"
);