Почему мои IdentityRoles и ApplicationUsers не попадают в мою базу данных? - PullRequest
4 голосов
/ 07 марта 2020

У меня проблемы с заполнением пользователей в моем веб-приложении. net core 3.1. Соответствующие таблицы создаются на SQL сервере, но при запуске приложения не создаются строки. Я не знаю, почему база данных не заполняется. Кто-нибудь может определить проблему?

Файл DBInitializer для заполнения пользователей базой данных

public class DBInitializer
{
    public static async Task Initialize(IServiceProvider services)
    {
        ApplicationDbContext database = services.GetRequiredService<ApplicationDbContext>();

        UserManager<ApplicationUser> userManager = services.GetRequiredService<UserManager<ApplicationUser>>();

        RoleManager<IdentityRole> roleManager = services.GetRequiredService<RoleManager<IdentityRole>>();

        string roleA = "A";
        string roleB = "B";

        if (!database.Roles.Any())
        {
            IdentityRole role = new IdentityRole(roleA);
            await roleManager.CreateAsync(role);
            IdentityRole roleOne = new IdentityRole(roleB);
            await roleManager.CreateAsync(roleOne);
            await database.SaveChangesAsync();
        }

        if (!database.ApplicationUsers.Any())
        {

            AppUserA appUser = new AppUserA("App", "UserA", "AppUserA1@wmu.edu",
                "306.000.0001", "AppUserA1");
            await userManager.CreateAsync(appUser);
            await userManager.AddToRoleAsync(appUser, roleA);

            AppUserB appUserFour = new AppUserB("App", "UserB1", "AppUserB1@wmu.edu",
                "306.000.0001", "AppUserB1");
            await userManager.CreateAsync(appUserFour);
            await userManager.AddToRoleAsync(appUserFour, roleA);
           await database.SaveChangesAsync();
        }

Класс ApplicationUser, который расширяет Asp. net Класс IdentityUser

public class ApplicationUser : IdentityUser
{
    public String FirstName { get; set; }
    public String LastName { get; set; }

    public String FullName => FirstName + " " + LastName;

    public ApplicationUser()
    {
    }

    public ApplicationUser(string firstName, string lastName, string email, string phoneNumber, string password)
    {
        this.FirstName = firstName;
        this.LastName = lastName;
        this.Email = email;
        this.PhoneNumber = phoneNumber;
        this.UserName = email;
        PasswordHasher<ApplicationUser> passwordHasher = new PasswordHasher<ApplicationUser>();
        this.PasswordHash = passwordHasher.HashPassword(this, password);

        this.SecurityStamp = Guid.NewGuid().ToString();
    }

Класс AppUserA, расширяющий приложение пользователя

 public class AppUserA : ApplicationUser
{
    public AppUserA()
    {
    }

    public AppUserA(string firstName, string lastName, string email, string phoneNumber, string password)
        : base(firstName, lastName, email, phoneNumber, password)
    {
    }
}

Файл ApplicationDBContext:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{

    public DbSet<ApplicationUser> ApplicationUsers { get; set; }

    public DbSet<AppUserA> AppUserAs { get; set; }

    public DbSet<AppUserB> AppUserBs { get; set; }


    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {

    }


}

1 Ответ

0 голосов
/ 09 марта 2020

Вот рабочая демонстрация, как показано ниже:

1.Модель:

public class ApplicationUser : IdentityUser
{
    public String FirstName { get; set; }
    public String LastName { get; set; }

    public String FullName => FirstName + " " + LastName;

    public ApplicationUser()
    {
    }

    public ApplicationUser(string firstName, string lastName, string email, string phoneNumber, string password)
    {
        this.FirstName = firstName;
        this.LastName = lastName;
        this.Email = email;
        this.PhoneNumber = phoneNumber;
        this.UserName = email;
        PasswordHasher<ApplicationUser> passwordHasher = new PasswordHasher<ApplicationUser>();
        this.PasswordHash = passwordHasher.HashPassword(this, password);

        this.SecurityStamp = Guid.NewGuid().ToString();
    }
}
public class AppUserA : ApplicationUser
{
    public AppUserA()
    {
    }

    public AppUserA(string firstName, string lastName, string email, string phoneNumber, string password)
        : base(firstName, lastName, email, phoneNumber, password)
    {
    }
}
public class AppUserB : ApplicationUser
{
    public AppUserB()
    {
    }

    public AppUserB(string firstName, string lastName, string email, string phoneNumber, string password)
        : base(firstName, lastName, email, phoneNumber, password)
    {
    }
}

2.Program.cs:

public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
        CreateDbIfNotExists(host);
        host.Run();
        //CreateHostBuilder(args).Build().Run();
    }
    private static async Task CreateDbIfNotExists(IHost host)
    {
        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                 await DBInitializer.Initialize(services);
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred creating the DB.");
            }
        }
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

3.Startup.cs :

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser,IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddControllersWithViews();
    services.AddRazorPages();
}

Результат: enter image description here

...