首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Asp.Net站点启动时强制“更新数据库”?

如何在Asp.Net站点启动时强制“更新数据库”?
EN

Stack Overflow用户
提问于 2018-05-24 19:08:32
回答 1查看 420关注 0票数 0

背景

我正在处理一个使用数据库迁移和Asp.Net标识的现有Asp.Net站点。

该站点有一个文件夹" migrations ",其中包含一些数据库迁移。不久前,我创建了一个"Seed_Only"-migration,它不做任何事情,而只是-顾名思义-在被调用时执行种子方法:

Update-Database -TargetMigration SeedOnly

如果静态助手类RolesName包含任何新角色,则Seed方法将创建新角色,这与它是否是好的实践无关:

代码语言:javascript
复制
// 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 });
    }
}

Question

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

目标

应出现以下情况:

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-28 13:56:39

我最终使用了the solution suggested here。它由以下部分组成:

1.创建所需数据的静态类

代码语言:javascript
复制
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调用静态类

代码语言:javascript
复制
protected void Application_Start()
{
    // Initialize database
    LocatorInitializationHandler.Initialize();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50507803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档