如何在部署期间在 Seed 方法中 运行 编码?

How to run code within Seed method during deployment?

我有一个使用 ASP.NET Identity (v2.1) 和 Entity Framework v6.1 的 Web Api 解决方案。在 Configuration.cs 文件的 Seed() 方法中,我有创建我的第一个身份用户的代码。此代码使用身份框架来散列密码、创建安全标记等。这些都是我无法通过 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() 在第一次访问数据库时被调用。这种自动行为有什么问题?

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

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