【问题标题】:How can I force "update-database" when Asp.Net site startsAsp.Net 站点启动时如何强制“更新数据库”
【发布时间】:2018-05-24 11:08:31
【问题描述】:

背景

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

该站点有一个“迁移”文件夹,其中包含一些数据库迁移。前段时间,我创建了一个“Seed_Only”-migration,它不做任何事情,只是——顾名思义——在这样调用时执行 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 });
    }
}

问题

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

目标

应该会发生以下情况:

  1. 如果新角色不存在,则创建新角色
  2. 将新角色添加到现有用户 - 如果用户是先前现有角色的成员

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

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

【问题讨论】:

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


    【解决方案1】:

    我最终使用了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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 2011-02-22
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多