Asp.Net L'Identité IdentityDbContext<TUser> de causer des problèmes pour les champs ajoutés à AspNetRoles table
-
21-12-2019 - |
Question
IdentityDbContext de causer des problèmes pour les propriétés et les champs ajoutés à AspNetRoles
Je crois que le problème est ici avec IdentityDbContext prendre un IdentityUser type:
public class MyIdentityDb : IdentityDbContext<ApplicationUser>
{
public IdentityDb()
: base("IdentityDb")
{
}
}
Mais laissez-moi vous expliquer...
C'est merveilleux que nous pouvons ajouter des champs à la AspNetUsers tableau en ajoutant des propriétés de notre ApplicationUser classe qui hérite de IdentityUser.Exemple:
public class ApplicationUser : IdentityUser
{
[Required]
[StringLength(50)]
public string FirstName { get; set; }
[Required]
[StringLength(50)]
public string LastName { get; set; }
}
Donc naturel que l'on peut ajouter des champs à la AspNetRoles table en ajoutant des propriétés à une ApplicationRole classe qui hérite de IdentityRole.Exemple:
public class ApplicationRole : IdentityRole
{
[Required]
[StringLength(50)]
public string ProperName { get; set; }
}
Fonctionne parfaitement.On peut voir le champ dans la base de données.Nous pouvons ajouter des données.Exemple:
RoleManager<ApplicationRole> roleManager = new RoleManager<ApplicationRole>(new RoleStore<ApplicationRole>(new MyIdentityDb()));
var role = new ApplicationRole() { Name = name, ProperName = propername };
var result = await roleManager.CreateAsync(role);
Mais maintenant, nous nous heurtons à un problème lorsque vous essayez d'accéder aux données.Exemple:
Notre ViewModel:
public class IndexViewModel
{
public IList<ApplicationUser> Users { get; set; }
public IList<ApplicationRole> Roles { get; set; }
}
Sur notre Contrôleur:
private MyIdentityDb myIdentityDb = new MyIdentityDb();
Notre méthode de l'Indice sur notre contrôleur:
public ViewResult Index(int? page)
{
return View(new IndexViewModel
{
Users = myIdentityDb.Users.ToList(),
Roles = myIdentityDb.Roles.ToList()
});
}
L'erreur est sur “myIdentityDb.Les rôles.ToList()” et indique “Impossible de convertir implicitement le type de System.Collection.Generic.List<Microsoft.AspNet.Identity.EntityFramework.IdentityRole> to System.Collections.Generic.IList<MyApp.Models.ApplicationRole>
…
Bien sûr, nous pourrions changer notre ViewModel à utiliser le type IdentityRole comme l'exemple suivant, mais on ne peut pas obtenir à la nouvelle “ProperName” de la AspNetRoles table:
public class IndexViewModel
{
public IList<ApplicationUser> Users { get; set; }
public IList<IdentityRole> Roles { get; set; }
}
Donc, on pourrait essayer de créer une autre base de données de la classe et de passer un IdentityRole type, au lieu de IdentityUser:
public class MyIdentityDb : IdentityDbContext<ApplicationUser>
{
public MyIdentityDb()
: base("MyIdentityDb")
{
}
}
public class MyIdentityRolesDb : IdentityDbContext<ApplicationRole>
{
public MyIdentityRolesDb()
: base("MyIdentityDb")
{
}
}
Et de changer notre contrôleur:
private MyIdentityDb myIdentityDb = new MyIdentityDb();
private MyIdentityRolesDb myIdentityRolesDb = new MyIdentityRolesDb();
Et de changer notre méthode de l'Indice sur notre contrôleur:
public ViewResult Index(int? page)
{
return View(new IndexViewModel
{
Users = myIdentityDb.Users.ToList(),
Roles = myIdentityRolesDb.Roles.ToList()
});
}
Mais nous nous retrouvons avec le même problème;le fait que IdentityDbContext prend un IdentityUser type.
Des idées comment nous pouvons obtenir une liste de Rôles avec les champs personnalisés/propriétés?
La solution
Donc, si vous mettez à niveau vers la version 2.0.0 beta paquets, vous devriez être en mesure d'obtenir un IQueryable de ApplicationRole directement à partir du gestionnaire de rôles:
roleManager.Roles
Si vous n'avez pas à tomber à la DB contexte, c'était une limitation de la version 1.0 qui a été résolu dans la version 2.0.
Autres conseils
Veuillez consulter l'article suivant qui explique en détail ce que vous essayez de faire http://typecastexception.com/post/2014/02/13/ASPNET-MVC-5-Identity-Extending-and-Modifying-Roles.aspx