Подтвердить что ты не робот

Ошибка проверки подлинности 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
{

}
4b9b3361

Ответ 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
}