背景
我正在使用现有的Asp.Net网站,该网站使用数据库迁移和Asp.Net标识。
该网站有一个“迁移”文件夹,其中包含一些数据库迁移。不久之前,我创建了一个“Seed_Only” - 移植,它没有做任何事情,但只是 - 顾名思义 - 在调用时执行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进行部署)。
目标
应该发生以下情况:
This related answer建议我从ApplicationDbContext的构造函数中调用Database.SetInitializer(new ApplicationDbInitializer());
。如果我正确理解答案,这将解决我“持续保持角色最新”的需要,但这并不能解决我将现有用户添加到新角色的需要,如第2点所述。
我应该如何实现目标?
答案 0 :(得分:0)
我最终使用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();
}