asp.net - 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 进行部署)。
目标
应该发生以下情况:
- 如果新角色不存在,则创建新角色
- 将新角色添加到现有用户 - 如果用户是先前存在的角色的成员
这个相关的答案表明我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();
}
推荐阅读
- c++ - 欧拉计划 23 C++
- python - SystemExit:python google colab中的2个无法识别的参数
- django - Django rest 框架 api 测试返回空结果
- svelte - 苗条工兵 - onMount 不触发
- java - 如何等到属性具有不同的值?
- javascript - 如何在一个函数中返回两个函数,该函数在反应中呈现为两个组件,而不是第二个函数覆盖第一个函数
- laravel - 我如何从 laravel 中的两个表中获取记录或如何将日期与第二个表匹配
- python - 高效的递归迭代器:可能吗?
- flutter - Flutter - 当列表向下滚动时显示一个浮动小部件
- wordpress - 您的网站出现严重错误。了解有关在 WordPress 中调试的更多信息