Asp.net Core中的播种数据库,无法创建管理员帐户

问题描述 投票:0回答:1

启动应用程序时,我试图创建一个默认的管理员帐户。现在,我感兴趣的是如何在asp.net核心中播种数据库。我有一个在主程序中运行的种子代码。它没有显示错误,但是不会更新数据库。我一直试图在我的SeedData中将“身份卷”更改为“应用程序角色”,但是它根本没有任何作用。我不想更改大多数代码,并且我知道可以使用模型构建器来完成,但是我不希望这样。我认为问题出在主程序上,但是我不明白我需要更改什么。我的代码显示在这里。

SeedData.cs

namespace AspNetCoreTodo
{

public static class SeedData
{
    public static async Task InitializeAsync(IServiceProvider services)
    {
        var roleManager = services.GetRequiredService<RoleManager<IdentityRole>>();
        await EnsureRolesAsync(roleManager);

        var userManager = services.GetRequiredService<UserManager<ApplicationUser>>();
        await EnsureTestAdminAsync(userManager);
    }

    private static async Task EnsureRolesAsync(RoleManager<IdentityRole> roleManager)
    {
        var alreadyExists = await roleManager.RoleExistsAsync(Constants.AdministratorRole);

        if (alreadyExists) return;

        await roleManager.CreateAsync(new IdentityRole(Constants.AdministratorRole));
    }

    private static async Task EnsureTestAdminAsync(UserManager<ApplicationUser> userManager)
    {
        var testAdmin = await userManager.Users
            .Where(x => x.UserName == "[email protected]")
            .SingleOrDefaultAsync();

        if (testAdmin != null) return;

        testAdmin = new ApplicationUser { Email = "[email protected]", UserName = "[email protected]" };
        await userManager.CreateAsync(testAdmin, "NotSecure123!!");
        await userManager.AddToRoleAsync(testAdmin, Constants.AdministratorRole);
    }
}
}

ApplicationDbContext.cs

    namespace AspNetCoreTodo.Data
{
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
    public DbSet<TodoItem> Items {get;  set;}


    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);
    }

}
}

Program.cs

    namespace AspNetCoreTodo
{
    public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    private static void InitializeDatabase(IWebHost host)
    {
        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                SeedData.InitializeAsync(services).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred seeding the DB.");
            }
        }
    }

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

Startup.cs //配置

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

        services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>(); 

        services.AddControllersWithViews();
       services.AddRazorPages();
        services.AddMvc();
        services.AddAuthentication();
       services.AddScoped<ITodoItemService, TodoItemService>();
    }
asp.net asp.net-mvc database seeding
1个回答
0
投票
您能否尝试用Main()方法调用您的方法:

public static void Main(string[] args) { var webHost = CreateWebHostBuilder(args).Build(); InitializeDatabase(webHost); webHost.Run(); }

注:您必须创建“ webHost”变量,因为您的方法将“ IWebHost”作为参数。并且CreateWebHostBuilder(string[] args)方法返回IWebHostBuilder的类型。 Run()方法也适用于IWebHost的类型。 

[Note:正如Nilay上面所指出的,我也将数据库植入Startup.cs的[]中]

if(env.isDevelopment){ InitializeDatabase(webHost); }

通常,播种是“发展”的目的。
© www.soinside.com 2019 - 2024. All rights reserved.