我想将IdentityContext与mydbcontext集成,但我遇到了这个错误
在模型生成过程中检测到一个或多个验证错误:
Ivdb.Dal.Concrete.EFCodeFirst.IdentityUserLogin: : EntityType 'IdentityUserLogin' 未定义键。定义此实体类型的键。Ivdb.Dal.Concrete.EFCodeFirst.IdentityUserRole: : EntityType 'IdentityUserRole' 未定义键。定义此实体类型的键。IdentityUserLogins:EntityType:EntitySet 'IdentityUserLogins' 基于未定义密钥的类型 'IdentityUserLogin'。IdentityUserRoles:EntityType:EntitySet 'IdentityUserRoles' 基于未定义键的类型 'IdentityUserRole'。
我该如何解决这个问题?
法典:
public partial class ivdbDb156978Context : IdentityDbContext<ApplicationUser>
{
static ivdbDb156978Context()
{
Database.SetInitializer<ivdbDb156978Context>(null);
}
public ivdbDb156978Context()
: base("Name=ivdbContext")
{
}
public DbSet<Car> Cars { get; set; }
应用程序用户
public class ApplicationUser : IdentityUser
{
}
您的代码没有显示这一点,但从您遇到的错误来看,我假设您正在覆盖 OnModelCreateing。这是IdentityDbContext<ApplicationUser>
配置实体框架映射的地方。这意味着,如果要覆盖 OnModelCreate,则需要调用 base 或必须自己执行映射。
所以要么这个:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// your stuff here
}
或者您执行映射:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
}
如果你不想调用 base。OnModel创建并想要执行自己的映射,您的映射应如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id).Property(p => p.Name).IsRequired();
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
modelBuilder.Entity<IdentityUserLogin>().HasKey(u => new {u.UserId, u.LoginProvider, u.ProviderKey});
}
如果您仅将 IdentityUserLogin 的密钥放在 UserId 上,则在使用默认的 google login 时会获得 DbEntityValidationExceptions。
要点是你不能有一个空的 OnModelCreating
好
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// your stuff here
}
坏
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// base.OnModelCreating(modelBuilder);
// your stuff here
}