我正在尝试使用EF Core 2.1 HasData模式为Identity表添加种子,该代码将执行,但没有任何内容插入表中。
我的DBContext类代码:
public partial class IdentityDBContext : IdentityDbContext<IdentityUser>
{
public IdentityDBContext(DbContextOptions<IdentityDBContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
IdentityRole RootRole = new IdentityRole
{
Id = Guid.NewGuid().ToString(),
Name = IdentityDBContext.RoleTypes.RootAdmin,
NormalizedName = "Root Admin"
};
builder.Entity<IdentityRole>().HasData(RootRole);
IdentityUser AdminUser = new IdentityUser
{
Id = Guid.NewGuid().ToString(),
UserName = "m@soze.biz",
Email = "m@soze.biz",
NormalizedUserName = "m@soze.biz".ToUpper(),
NormalizedEmail = "m@soze.biz".ToUpper(),
EmailConfirmed = true
};
builder.Entity<IdentityUser>().HasData(AdminUser);
builder.Entity<IdentityUserRole<string>>().HasData(new IdentityUserRole<string>
{
UserId = AdminUser.Id,
RoleId = RootRole.Id
});
}
}
在Startup.cs中的Configure方法中,我有:
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var IdentityContext = serviceScope.ServiceProvider.GetRequiredService<IdentityDBContext>();
IdentityContext.Database.Migrate();
}
我可以毫无例外地逐步执行OnModelCreating
代码,但是没有记录添加到表中,AspNetUsers
和AspNetRoles
都是空的。
关于为何无法正常工作的任何建议?
答案 0 :(得分:0)
对于您的问题,原因是Migrate
仅应用了挂起的迁移,而在更改IdentityDBContext
之后将无法检测到更改。
使用Identity
创建项目时,它将自动创建第一个迁移,然后即使您更改了IdentityDBContext
,Migrate
也将仅应用第一个迁移,而无需执行其他操作。
有两个选项供您选择:
对于首次初始化数据库,您可以尝试下面的代码,该代码将为数据提供种子。
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var IdentityContext = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
IdentityContext.Database.EnsureCreated();
}
第二个选项是您已经尝试过。在运行Migrate
之前,运行Add-Migration
为新的更改生成迁移。
答案 1 :(得分:0)
按照Tao的回答,如果您使用Visual Studio模板创建了项目并在其中添加了身份验证作为选项,则迁移将已经添加。 “ HasData”方法不在“ Update-Database”阶段执行,而是在“ Add-Migration”阶段执行,并添加到您的迁移中。 您需要删除“ Migrations”文件夹,然后在程序包命令窗口中运行“ Add-Migration CreateIdentitySchema”,以便将种子数据应用于迁移。 然后,更新数据库将从新迁移中播种您的数据。 一个星期天,这使我疯狂了3个小时。