具有IdentityDbContext和hasData种子的EFcore创建IdentityRole

时间:2018-11-27 10:04:55

标签: c# .net-core entity-framework-core ef-migrations

我有点眼花;乱; 我正在使用dotnet core(2.1)EF进行迁移。当我仅基于上下文创建第一个迁移时,实际上看起来一切正常。

所以我有一个类似的上下文:

 /** Gets the case type info configuration that is used on various views */
    getCaseTypeInfo(spinnerMessage: string): Observable<CaseTypeInfoModel[]> {
        let result: Observable<CaseTypeInfoModel[]>;
        if (this.caseTypeInfoSnapshot) {
            result = of(this.caseTypeInfoSnapshot);
        } else {
            result = this.http.get<CaseTypeInfoModel[]>(`${this.api}/types`, spinnerMessage).pipe(map(i => {
                this.caseTypeInfoStoreService.addCaseTypeInfoToStore(i);
                return i;
            }));
        }
        return result;
    }

因此,在创建迁移后,它想要添加:

public function cacheKey()
    {
        return sprintf(
            "%s/%s-%s",
            $this->getTable(),
            $this->getKey(),
            $this->updated_at->timestamp
        );
    }

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }

    public function getCachedCommentsCountAttribute()
    {
        return Cache::remember($this->cacheKey() . ':comments_count', 15, function () {
            return $this->comments->count();
        });
    }

我想的都很好。

然后,我开始关注以下文章; How to seed an Admin user in EF Core 2.1.0?

设置public class DataContext : IdentityDbContext<User, IdentityRole<Guid>, Guid> { public virtual DbSet<Country> Countries { get; set; } public virtual DbSet<CountryUser> CountryUsers { get; set; } //..more stuff public DataContext(DbContextOptions options) : base(options) { } } 并为数据库添加种子之后,创建了一个新的迁移,它创建了一个新的迁移,在该迁移中它想删除migrationBuilder.CreateTable( name: "AspNetRoles", columns: table => new { Id = table.Column<Guid>(nullable: false), Name = table.Column<string>(maxLength: 256, nullable: //etc. etc. Removed rest of migrations. 表并创建为新表HasData。 我只是删除了数据库,然后尝试再次进行该操作,现在它只希望在播种时插入数据。但是我无法弄清楚我所做的更改,甚至更好,为什么它要删除并创建不同的表。

有人可以解释何时创建AspNetRoles和何时创建IdentityRole(以及随之而来的其他表格)。

只是要确定;上下文总是从

扩展

AspNetRoles

和我的IdentityRoles

: IdentityDbContext<User, IdentityRole<Guid>, Guid>

thnx !!

1 个答案:

答案 0 :(得分:4)

据我了解,您正在采用以下方法:

modelBuilder.Entity<IdentityRole>().HasData(new IdentityRole { Name = "Admin", NormalizedName = "Admin".ToUpper() });

此代码有两个问题。

第一个是modelBuilder.Entity<IdentityRole>()的用法。这使IdentityRole类被EF Core视为实体,因此它尝试创建的IdentityRoles表。这是因为IdentityRole类与模型所使用的类-IdentityRole<Guid>不同。将其更改为modelBuilder.Entity<IdentityRole<Guid>>()(以及new运算符)即可解决问题。

第二个问题是HasData 需要要指定的PK值,如EF Core文档的Data Seeding部分所述:

  

即使通常由数据库生成,也需要指定主键值。它将用于检测迁移之间的数据更改。

因此,除了更改HasData泛型类型参数之外,您还需要预先生成Guid用作新角色的ID(有关类似问题,请参见Entity Framework Core Auto Generated guid以获得更多详细信息)并使用一些方法像这样:

modelBuilder.Entity<IdentityRole<Guid>>().HasData(
    new IdentityRole<Guid>
    {
        Id = new Guid("pre generated value"),
        Name = "Admin",
        NormalizedName = "Admin".ToUpper()
    }
);