Estoy siguiendo la documentación para usar Identity y estoy intentando registrar un nuevo usuario (ejecutando la acción de registro), pero falla con el siguiente error:

InvalidOperationException: no se puede crear un DbSet para 'ApplicationUser' porque este tipo no está incluido en el modelo para el contexto.

Puesta en marcha:

services.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
    //password options
    options.Password.RequireDigit = false;
    // ...
})

Estoy usando un ApplicationUser estándar:

public class ApplicationUser : IdentityUser
{
}

Registrar acción en AccountController:

public async Task<IActionResult> Register(RegisterViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        var user = new ApplicationUser { UserName = viewModel.UserName, Email = viewModel.Email };
        var result = await _userManager.CreateAsync(user, viewModel.Password); //<-- Exception happens here
        if (result.Succeeded)
        {
            await _signInManager.SignInAsync(user, isPersistent: false);
            _logger.LogInformation(3, "User created a new account with password.");
            return RedirectToAction(nameof(HomeController.Index), "Home");
        }

        string errorData = "";
        foreach (var error in result.Errors)
        {
            errorData += error.Description + '\n';
        }
        StoreErrorMessage("Failed to create the user!", errorData);
    }

    return View(viewModel);
}

Ya probé lo siguiente:

  • Añadiendo DbSet<ApplicationUser> a AplicationContext
  • Creé y apliqué una nueva migración a través de dotnet ef
5
FSMaxB 1 sep. 2016 a las 06:23

2 respuestas

La mejor respuesta

Encontré el problema. Mi ApplicationContext estaba heredando de DbContext. Lo cambié a IdentityDbContext<ApplicationUser> y funciona.

12
FSMaxB 1 sep. 2016 a las 03:57

Cree una nueva clase de contexto que herede IdentityDbContext.

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    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);
    }
}

Y en el archivo startup.cs agregue el siguiente código

services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(connection));

Esto le ayudará en el primer acercamiento a la base de datos.

2
aditya mukkawar 9 nov. 2017 a las 18:02