背景
我正在处理一个使用数据库迁移和Asp.Net标识的现有Asp.Net站点。
该站点有一个文件夹" migrations ",其中包含一些数据库迁移。不久前,我创建了一个"Seed_Only"-migration,它不做任何事情,而只是-顾名思义-在被调用时执行种子方法:
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 });
}
}
Question
我们将介绍几个新角色。我想确保运行应用程序的每个站点在部署时都会更新数据库(我们使用Octopus进行部署)。
目标
应出现以下情况:
This related answer建议我从ApplicationDbContext的构造函数调用Database.SetInitializer(new ApplicationDbInitializer());
。如果我正确理解了答案,这将解决我“持续保持角色更新”的需求,但它不能解决我将现有用户添加到新角色的需求,如第2点所述。
我应该如何着手实现我的目标?
发布于 2018-05-28 13:56:39
我最终使用了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();
}
https://stackoverflow.com/questions/50507803
复制相似问题