如何在 Asp.Net 网站启动时强制 "update-database"
How can I force "update-database" when Asp.Net site starts
背景
我正在开发一个现有的 Asp.Net 站点,该站点使用数据库迁移和 Asp.Net 身份。
站点有一个文件夹 "Migrations",有一些数据库迁移。前一段时间,我创建了一个 "Seed_Only"-migration,它不执行任何操作,但简单地 - 顾名思义 - 在调用时执行 Seed 方法:
Update-Database -TargetMigration SeedOnly
不管它是否是好的做法,如果静态助手 class 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 });
}
}
问题
我们即将介绍几个新角色。我想确保运行该应用程序的每个站点在部署时更新其数据库(我们使用八达通部署)。
目标
应该会发生以下情况:
- 创建新角色(如果尚不存在)
- 将新角色添加到现有用户 - 如果用户是以前存在的角色的成员
建议我从 ApplicationDbContext 的构造函数中调用 Database.SetInitializer(new ApplicationDbInitializer());
。如果我正确理解答案,这将解决我对 "continuously keeping the roles up to date" 的需求,但它不能解决我将现有用户添加到新角色的需求,如第 2 点所述。
我应该如何着手实现我的目标?
我最终使用了 the solution suggested here。它包括:
1.创建所需数据的静态 class
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
调用静态 class
protected void Application_Start()
{
// Initialize database
LocatorInitializationHandler.Initialize();
}
背景
我正在开发一个现有的 Asp.Net 站点,该站点使用数据库迁移和 Asp.Net 身份。
站点有一个文件夹 "Migrations",有一些数据库迁移。前一段时间,我创建了一个 "Seed_Only"-migration,它不执行任何操作,但简单地 - 顾名思义 - 在调用时执行 Seed 方法:
Update-Database -TargetMigration SeedOnly
不管它是否是好的做法,如果静态助手 class 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 });
}
}
问题
我们即将介绍几个新角色。我想确保运行该应用程序的每个站点在部署时更新其数据库(我们使用八达通部署)。
目标
应该会发生以下情况:
- 创建新角色(如果尚不存在)
- 将新角色添加到现有用户 - 如果用户是以前存在的角色的成员
Database.SetInitializer(new ApplicationDbInitializer());
。如果我正确理解答案,这将解决我对 "continuously keeping the roles up to date" 的需求,但它不能解决我将现有用户添加到新角色的需求,如第 2 点所述。
我应该如何着手实现我的目标?
我最终使用了 the solution suggested here。它包括:
1.创建所需数据的静态 class
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
调用静态 classprotected void Application_Start()
{
// Initialize database
LocatorInitializationHandler.Initialize();
}