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

问题描述:

我有一个使用ASP.NET Identity(v2.1)和Entity Framework v6.1的Web Api解决方案。在Configuration.cs文件的Seed()方法内部,我有创建我的第一个Identity用户的代码。此代码使用Identity框架来散列密码,创建安全标记等。这些都是我无法通过SQL执行的所有操作,因此添加到Up()方法似乎不是一种选择。如何在部署期间在Seed方法中运行代码?

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 = "[email protected]", 
     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); 
+0

难道'YourInitializer'设置为来电种子的方法? – webworm

+0

我在找的是第一次访问数据库时没有调用'Seed()'方法。在我的情况下,'Seed()'方法在'AspNetUsers'表中创建一个用户。如果我运行'Update-Database -Script'命令,我将获得用于架构创建的SQL。使用该模式,我可以创建数据库。但是,如果我尝试访问API端点,则调用将失败。 API端点应该访问数据库以验证用户名/密码。但由于用户不在场而失败。 – webworm