当Asp.Net站点启动时,如何强制“更新数据库”

时间:2018-05-24 11:08:32

标签: asp.net entity-framework-6 ef-migrations

背景

我正在使用现有的Asp.Net网站,该网站使用数据库迁移和Asp.Net标识。

该网站有一个“迁移”文件夹,其中包含一些数据库迁移。不久之前,我创建了一个“Seed_Only” - 移植,它没有做任何事情,但只是 - 顾名思义 - 在调用时执行Seed方法:

Update-Database -TargetMigration SeedOnly

如果静态帮助程序类Seed包含任何新角色,RolesName方法是否为良好实践无关,则创建新角色:

// Iterate all properties of RolesName and create roles if they don't exist
Type type = typeof(RolesName); 
foreach (var p in type.GetFields())
{
    var v = p.GetValue(null).ToString(); // static classes cannot be instanced, so use null...
    if (!context.Roles.Any(x => x.Name.Equals(v)))
    {
        roleManager.Create(new IdentityRole() { Name = v });
    }
}

问题

我们即将介绍几个新角色。我想确保运行应用程序的每个站点在部署时更新它的数据库(我们使用Octopus进行部署)。

目标

应该发生以下情况:

  1. 创建新角色(如果它们尚不存在)
  2. 将新角色添加到现有用户 - 如果用户是以前存在的角色的成员
  3. This related answer建议我从ApplicationDbContext的构造函数中调用Database.SetInitializer(new ApplicationDbInitializer());。如果我正确理解答案,这将解决我“持续保持角色最新”的需要,但这并不能解决我将现有用户添加到新角色的需要,如第2点所述。

    我应该如何实现目标?

1 个答案:

答案 0 :(得分:0)

我最终使用the solution suggested here。它包括:

<强> 1。创建所需数据的静态类

public static class LocatorInitializationHandler
{
    public static void Initialize()
    {
        using (var db = new ApplicationDbContext())
        {
            CreateRoles(db);
        }
    }

    private static void CreateRoles(ApplicationDbContext context)
    {
        // iterate role names
        // and insert into db if not already exists
    }
}

<强> 2。从global.asax.cs

调用静态类
protected void Application_Start()
{
    // Initialize database
    LocatorInitializationHandler.Initialize();
}