57 votes

Erreur de validation d'identité en Asp.net

Je veux intégrer IdentityContext avec mydbcontext mais j'ai cette erreur

Une ou plusieurs erreurs de validation ont été détectées pendant la génération du modèle :

Ivdb.Dal.Concrete.EFCodeFirst.IdentityUserLogin : : L'EntityType 'IdentityUserLogin' n'a pas de clé définie. Définissez la clé pour cet EntityType. Ivdb.Dal.Concrete.EFCodeFirst.IdentityUserRole : : EntityType 'IdentityUserRole' has no key defined. Définissez la clé pour cet EntityType. IdentityUserLogins : EntityType : EntitySet 'IdentityUserLogins' is based on type 'IdentityUserLogin' that has no keys defined. IdentityUserRoles : EntityType : EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no keys defined.

Comment puis-je résoudre ce problème ?

Code :

 public partial class ivdbDb156978Context : IdentityDbContext<ApplicationUser> 
{
    static ivdbDb156978Context()
    {
        Database.SetInitializer<ivdbDb156978Context>(null);
    }

    public ivdbDb156978Context()
        : base("Name=ivdbContext")
    {
    }

    public DbSet<Car> Cars { get; set; }

Utilisateur de l'application

    public class ApplicationUser : IdentityUser
{

}

152voto

Olav Nybø Points 4054

Votre code ne le montre pas, mais d'après les erreurs que vous obtenez, je suppose que vous surchargez le paramètre OnModelCreating. IdentityDbContext<ApplicationUser> configurer les mappages du cadre des entités. Cela signifie que si vous voulez remplacer OnModelCreating, vous devez soit appeler la base, soit faire le mappage vous-même.

Alors, soit ça :

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    // your stuff here
}

Ou vous faites la cartographie :

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 });
}

6voto

AAD Points 71

Si vous ne voulez pas appeler base.OnModelCreating et que vous voulez faire votre propre mappage, votre mappage devrait ressembler à ceci :

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});
}

Si vous placez la clé pour IdentityUserLogin uniquement sur UserId, vous obtenez des DbEntityValidationExceptions lorsque vous utilisez le login google par défaut.

3voto

Barry MSIH Points 29

La conclusion est que vous ne pouvez pas avoir un OnModelCreating vide.

Bon

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  base.OnModelCreating(modelBuilder);
  // your stuff here
}

Mauvais

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  // base.OnModelCreating(modelBuilder);
  // your stuff here
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X