[英]How can I force “update-database” when Asp.Net site starts
背景
我正在使用数据库迁移和Asp.Net身份的现有Asp.Net网站上工作。
该站点有一个“迁移”文件夹,其中包含一些数据库迁移。 不久前,我创建了一个“ Seed_Only”迁移程序,该迁移程序不执行任何操作,但正如其名称所暗示的那样,仅在执行时执行Seed方法:
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 });
}
}
问题
我们将介绍几个新角色。 我想确保每个运行该应用程序的站点都在部署时更新数据库(我们使用八达通进行部署)。
目标
应该发生以下情况:
这个相关的答案建议我调用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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.