我有点眼花;乱; 我正在使用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 !!
答案 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()
}
);