【问题标题】:How to run code within Seed method during deployment?如何在部署期间在 Seed 方法中运行代码?
【发布时间】:2016-08-12 13:35:29
【问题描述】:

我有一个使用 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. 编写数据库脚本并包含数据,然后将其还原到 用于部署的数据库服务器。

【问题讨论】:

    标签: c# entity-framework-6 asp.net-web-api2 asp.net-identity-2


    【解决方案1】:

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

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

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

    【讨论】:

    • 可以设置YourInitializer调用Seed方法吗?
    • 我发现第一次访问数据库时没有调用Seed() 方法。在我的例子中,Seed() 方法在AspNetUsers 表中创建了一个用户。如果我运行Update-Database -Script 命令,我将获得用于创建模式的 SQL。使用该模式,我可以创建数据库。但是,如果我尝试访问 API 端点,调用会失败。 API 端点应该必须访问数据库以验证用户名/密码。然而它失败了,因为用户不存在。
    猜你喜欢
    • 1970-01-01
    • 2016-07-24
    • 2013-03-29
    • 2023-04-05
    • 2013-05-12
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多