HasData()播种后,EF Core 2.1身份表为空

时间:2018-11-20 01:02:28

标签: c# asp.net-core asp.net-identity ef-core-2.1

我正在尝试使用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代码,但是没有记录添加到表中,AspNetUsersAspNetRoles都是空的。

关于为何无法正常工作的任何建议?

2 个答案:

答案 0 :(得分:0)

对于您的问题,原因是Migrate仅应用了挂起的迁移,而在更改IdentityDBContext之后将无法检测到更改。

使用Identity创建项目时,它将自动创建第一个迁移,然后即使您更改了IdentityDBContextMigrate也将仅应用第一个迁移,而无需执行其他操作。

有两个选项供您选择:

  • 对于首次初始化数据库,您可以尝试下面的代码,该代码将为数据提供种子。

            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个小时。