Ошибка проверки подлинности Asp.net
Я хочу интегрировать IdentityContext с mydbcontext, но я принимаю эту ошибку
Во время генерации модели были обнаружены одна или несколько ошибок проверки:
Ivdb.Dal.Concrete.EFCodeFirst.IdentityUserLogin:: EntityType 'IdentityUserLogin' не имеет определенного ключа. Определите ключ для этого EntityType.
Ivdb.Dal.Concrete.EFCodeFirst.IdentityUserRole:: EntityType 'IdentityUserRole' не имеет ключа. Определите ключ для этого EntityType.
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
{
}
Ответы
Ответ 1
Ваш код не показывает это, но из ошибок, которые вы получаете, я предполагаю, что вы переопределяете OnModelCreating. Это где IdentityDbContext<ApplicationUser>
настраивать сопоставления каркаса сущности. Это означает, что если вы хотите переопределить OnModelCreating, вам нужно либо вызвать базу, либо выполнить само отображение.
Итак, либо это:
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 });
}
Ответ 2
Если вы не хотите вызывать base.OnModelCreating и хотите сделать свое собственное сопоставление, ваше сопоставление должно выглядеть следующим образом:
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, вы получите DbEntityValidationExceptions при использовании входа по умолчанию google по умолчанию.
Ответ 3
Отказ в том, что у вас не может быть пустой OnModelCreating
Хорошо
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// your stuff here
}
Bad
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// base.OnModelCreating(modelBuilder);
// your stuff here
}