我尝试使用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-Database
或Database.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; }
}
答案 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);
}