如何在部署期间运行Seed方法中的代码

本文关键字:方法 Seed 代码 运行 部署 | 更新日期: 2023-09-27 18:02:05

我有一个利用ASP的Web Api解决方案。. NET身份(v2.1)和实体框架v6.1。在Configuration.cs文件的Seed()方法中,我有创建第一个Identity用户的代码。该代码使用Identity框架来散列密码、创建安全戳等。这些都是我不能通过SQL做的事情,所以添加到Up()方法似乎不像一个选项。

protected override void Seed(ApplicationDbContext context)
{
    // Create the admin user
    var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
    var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));
    var user = new ApplicationUser()
    {
        UserName = "adminuser",
        Email = "adminuser@mycompany.com",
        EmailConfirmed = true,
        FirstName = "John",
        LastName = "Does",
        JoinDate = DateTime.Now.AddYears(-1)
    };
    manager.Create(user, "SuperSecurePassword321!");
    if (roleManager.Roles.Count() == 0)
    {
        roleManager.Create(new IdentityRole { Name = "Admin" });
        roleManager.Create(new IdentityRole { Name = "Employee" });
        roleManager.Create(new IdentityRole { Name = "Customer" });
    }
    var adminUser = manager.FindByName("adminuser");
    manager.AddToRoles(adminUser.Id, new string[] { "Admin" });
}

我需要使用FTP来发布这个(没有控制这个)。关于如何运行这段代码一旦它被部署和数据库模式设置的建议?

我考虑过的选项:

  1. 我想过创建一个API端点,当调用时可以但是,启动此代码时,该端点必须允许anonymous访问,因为它将创建第一个用户和系统中使用的角色。然后我就需要让它失效或稍后删除此端点。
  2. 脚本数据库,包括数据,然后恢复到要部署的数据库服务器。

如何在部署期间运行Seed方法中的代码

Seed()在第一次访问数据库时被调用。这种自动行为有什么问题?

如果您想手动调用它,请尝试在protected void Application_Start()中这样做:

Database.SetInitializer(new YourInititalizer());
var dbContext = new TheContextYouAreUsing();
dbContext.Database.Initialize(force: true);