Sto provando a migrare un'applicazione MVC .NET Core 1.1 utilizzando EntityFrameworkCore (1.0.1) da SQLite ( "Microsoft.EntityFrameworkCore.Sqlite": "1.0.1"
) a MySQL ( "MySql.Data.EntityFrameworkCore": "7.0.6-IR31"
).
Il mio contesto sta estendendo IdentityDbContext
e, quando si esegue Database.EnsureCreated()
, utilizzando Sqlite, le tabelle AspNet (RoleClaims, Roles, Users, ecc.) Sono state configurate automaticamente.
Con il connettore MySQL, quando provo ad eseguire sia Update-Database
che Database.EnsureCreated()
, ottengo l'errore:
The entity type 'IdentityUser' is part of a hierarchy, but does not have a discriminator value configured.
Dovrei davvero configurarlo manualmente, e se sì, come?
Contesto:
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; }
}
Sembra che il provider MySQL per EntityFramework Core non esegua automaticamente le registrazioni per le classi derivate (cosa che altri provider fanno implicitamente), motivo per cui è necessario specificare i discriminatori nel codice.
Tuttavia, poiché IdentityUser
non è una classe astratta, in teoria può anche essere istanziata e assegnata e il provider di database MySQL richiede anche una registrazione (anche se in produzione non ci sarà mai valore con questo discriminatore).
Quindi devi registrare anche la classe base.
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<IdentityUser>()
.HasDiscriminator<int>("Type")
.HasValue<IdentityUser>(0)
.HasValue<ApplicationUser>(1);
}