实体类型 'IdentityUser' 是层次结构的一部分,但没有配置鉴别器值

The entity type 'IdentityUser' is part of a hierarchy, but does not have a discriminator value configured

我正在尝试使用 EntityFrameworkCore (1.0.1) 将 .NET Core 1.1 MVC 应用程序从 SQLite ("Microsoft.EntityFrameworkCore.Sqlite": "1.0.1") 迁移到 MySQL ("MySql.Data.EntityFrameworkCore": "7.0.6-IR31")。

我的上下文正在扩展 IdentityDbContext,当 运行 宁 Database.EnsureCreated(),使用 Sqlite 时,AspNet 表(RoleClaims、角色、用户等)被自动配置。

使用 MySQL-连接器,当我尝试 运行 Update-DatabaseDatabase.EnsureCreated() 时,我得到错误:

The entity type 'IdentityUser' is part of a hierarchy, but does not have a discriminator value configured.

我真的应该手动配置吗?如果是的话,怎么办?

上下文:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{

    //DbSets here..

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {

    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<IdentityUser>()
            .HasDiscriminator<int>("Type")
            .HasValue<ApplicationUser>(1);
    }
}

应用程序用户:

public class ApplicationUser : IdentityUser
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Firmname { get; set; }
    public string CVR { get; set; }
    public string ATT { get; set; }
    public string Telephone { get; set; }
    public string Address { get; set; }
}

MySQL EntityFramework Core 的提供者似乎不会自动为派生的 classes 进行注册(其他提供者隐式地这样做),这就是为什么你需要在代码中指定鉴别器。

但是,由于 IdentityUser 不是抽象的 class,理论上它也可以实例化和分配,并且 MySQL 数据库提供程序也需要为它注册(即使在生产中,这个鉴别器永远不会有价值)。

所以你也必须注册基地class。

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<IdentityUser>()
        .HasDiscriminator<int>("Type")
        .HasValue<IdentityUser>(0)
        .HasValue<ApplicationUser>(1);
}