繁体   English   中英

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

[英]How can I force “update-database” when Asp.Net site starts

背景

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

该站点有一个“迁移”文件夹,其中包含一些数据库迁移。 不久前,我创建了一个“ Seed_Only”迁移程序,该迁移程序不执行任何操作,但正如其名称所暗示的那样,仅在执行时执行Seed方法:

Update-Database -TargetMigration SeedOnly

不管是否是好的做法,如果静态帮助器类RolesName包含任何新角色,那么Seed方法都会创建新角色:

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

问题

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

目标

应该发生以下情况:

  1. 创建新角色(如果尚不存在)
  2. 将新角色添加到现有用户-如果用户是以前存在的角色的成员

这个相关的答案建议我调用Database.SetInitializer(new ApplicationDbInitializer()); 从ApplicationDbContext的构造方法。 如果我正确地理解了答案,这将满足我“不断更新角色”的需求,但是并不能满足我在第2点中所述的将现有用户添加到新角色的需求。

我应该如何实现自己的目标?

我最终使用了此处建议的解决方案 它包括:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM