我正试图用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的配置方法中,我有:
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var IdentityContext = serviceScope.ServiceProvider.GetRequiredService<IdentityDBContext>();
IdentityContext.Database.Migrate();
}
我可以毫无例外地逐步执行OnModelCreating
代码,但表中没有添加任何记录,AspNetUsers
和AspNetRoles
都是空的。
有什么建议可以解释为什么这不起作用?
对于您的问题,原因是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
以生成新更改的迁移。
根据Tao的回答,如果您使用visualstudio模板创建了项目,并在其中添加了身份验证选项,那么迁移就已经添加了。"HasData"方法不会在"更新数据库"阶段执行,而是在"添加迁移"阶段执行并添加到迁移中。您需要删除"Migrations"文件夹,然后在包命令窗口中运行"Add Migration CreateIdentitySchema",以便将种子数据应用于迁移。"更新数据库"将为新迁移中的数据设定种子。一个星期天,这让我疯狂了三个小时。