Asp.net Ошибка Проверки Подлинности


Я хочу интегрировать IdentityContext с mydbcontext, но я беру эту ошибку

при создании модели была обнаружена одна или несколько ошибок проверки:

Ivdb.Далматинец.Бетон.EFCodeFirst.IdentityUserLogin:: EntityType 'IdentityUserLogin' не имеет определенного ключа. Определите ключ для этого EntityType. Ivdb.Далматинец.Бетон.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
{

}
3 57

3 ответа:

ваш код не показывает этого, но из ошибок, которые вы получаете, я предполагаю, что вы переопределяете OnModelCreating.Вот где IdentityDbContext<ApplicationUser> настройка сопоставлений Entity framework. Это означает, что если вы хотите переопределить 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 });
}

Если вы не хотите вызывать базу.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 по умолчанию.

вынос заключается в том, что вы не можете иметь пустой 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
}