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

时间:2016-12-27 20:08:58

标签: mysql asp.net-core entity-framework-core mysql-connector

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

我的上下文正在扩展IdentityDbContext,当使用Sqlite运行Database.EnsureCreated()时,会自动配置AspNet表(RoleClaims,Roles,Users等)。

使用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);
    }
}

ApplicationUser:

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; }
}

1 个答案:

答案 0 :(得分:6)

似乎EntityFramework Core的MySQL Provider不会自动为派生类(其他提供者隐式执行)注册,这就是你需要在代码中指定鉴别器的原因。

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

所以你必须注册基类。

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

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