首页 > 解决方案 > Asp.Net 站点启动时如何强制“更新数据库”

问题描述

背景

我正在使用数据库迁移和 Asp.Net 身份的现有 Asp.Net 站点。

该站点有一个“迁移”文件夹,其中包含一些数据库迁移。前段时间,我创建了一个“Seed_Only”-migration,它不做任何事情,只是——顾名思义——在调用时执行 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. 将新角色添加到现有用户 - 如果用户是先前存在的角色的成员

这个相关的答案表明我Database.SetInitializer(new ApplicationDbInitializer());从 ApplicationDbContext 的构造函数中调用。如果我正确理解答案,这将解决我“不断更新角色”的需求,但它不能解决我将现有用户添加到新角色的需求,如第 2 点所述。

我应该如何去实现我的目标?

标签: asp.netentity-framework-6entity-framework-migrations

解决方案


我最终使用了这里建议的解决方案。它包括:

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();
}

推荐阅读