Identité ASP.NET – Plusieurs jeux d’objects par type ne sont pas pris en charge

J’ai eu une erreur en utilisant ASP.NET Identity dans mon application.

Plusieurs jeux d’objects par type ne sont pas pris en charge. L’object définit ‘Identity Users’ et ‘Users’ peuvent tous deux contenir des instances de type ‘Recommendation Platform.Models.ApplicationUser’.

J’ai vu quelques questions sur cette erreur dans StackOverflow. Tous indiquent sur deux objects DbSet du même type. Mais dans mon DbContext il n’y a pas les mêmes types de DbSets . Une exception est levée sur la méthode FindAsync() lors de la connexion.

 if (ModelState.IsValid) var user = await UserManager.FindAsync(model.UserName, model.Password); if (user != null && user.IsConfirmed) { 

Le problème est que je n’ai pas deux DbSets du même type. Mes Contextes ressemblent à ceci:

 public class ApplicationDbContext : IdentityDbContext { public ApplicationDbContext() : base("DefaultConnection") { } public System.Data.Entity.DbSet IdentityUsers { get; set; } } 

et

 public class RecContext : DbContext { public RecContext() : base("RecConnection") { Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); } public DbSet Recommendations { get; set; } public DbSet Geolocations { get; set; } public DbSet Faqs { get; set; } public DbSet IndexTexts { get; set; } } 

Qu’est-ce qui pourrait causer ce problème? Peut-être quelque chose de connecté avec les fonctionnalités d’identité ASP.NET intégrées? Quoi qu’il en soit, quel est le type d’ Users ? Je ne l’ai pas dans mon application …

Vous avez deux DbSet du même type.

IdentityDbContext lui-même contient la propriété Users déclarée comme:

 public DbSet Users { get; set; } 

Vous déclarez le deuxième dans votre classe.

Passez en revue ce fichier “ApplicationDbContext.cs”, supprimez la ligne, générée automatiquement par le dernier support, devrait être comme ceci:

 public System.Data.Entity.DbSet IdentityUsers { get; set; } 

Ce problème peut survenir lors de l’utilisation d’un échafaudage pour créer une View . Vous avez probablement fait quelque chose comme ceci: View> Add> New Scaffold Item …> Vue MVC 5> [Classe de modèle: ApplicationUser] .

Ajouter une capture d'écran

L’assistant d’échafaudage a ajouté une nouvelle ligne de code dans votre classe ApplicationDbContext .

 public System.Data.Entity.DbSet IdentityUsers { get; set; } 

Vous disposez maintenant de deux propriétés DbSet du même type, qui provoquent non seulement une FindAsync() dans la méthode FindAsync() , mais également lorsque vous essayez d’utiliser des migrations FindAsync() sur le code.

Exception lors de l'utilisation de migrations à code unique

Soyez très prudent lorsque vous utilisez un échafaudage ou, mieux encore, ne l’utilisez pas.