ASP.Net标识,角色中的用户始终为空

时间:2016-06-02 09:53:17

标签: asp.net-mvc asp.net-identity asp.net-identity-2

我已经在本文后面的一些自定义属性中实现了ASP.Net标识 -

http://typecastexception.com/post/2014/06/22/ASPNET-Identity-20-Customizing-Users-and-Roles.aspx

一切顺利,除了。我希望让用户处于特定角色(例如,让我的所有用户都处于管理员角色下)。

我尝试了以下方法来检索用户 -

            var userRole = _roleManager.Roles.SingleOrDefault(m => m.Name == role.Name);
            var usersInRole = _userManager.Users.Where(m => m.Roles.Any(r => r.RoleId == userRole.Id));
            var usersInRole2 = _userService.GetUsers().Where(u => u.Roles.Any(r => r.RoleId == userRole.Id));

_roleManager的类型为ApplicationRoleManager : RoleManager<ApplicationRole>_userManager的类型为ApplicationUserManager : UserManager<ApplicationUser, string>

我无法在_userManager_userService

中获取用户下的角色

PS:_userService是扩展IRepository的服务,查询DbSet<ApplicationUser>

我可以看到角色已在表ApplicationUserRoles中正确映射,当我_userManager.IsInRole(user.Id, "Admin");时,我得到了预期的结果。

这有什么问题?

的Rahul。

2 个答案:

答案 0 :(得分:3)

如果您正在使用Entity Framework,听起来好像是因为延迟加载而被捕获(因为角色正在添加到数据库中,但是当从可查询中请求时却没有。)

尝试以下内容:

_userManager.Users.Include(x => x.Roles).Where(m => m.Roles.Any(r => r.RoleId == userRole.Id));

答案 1 :(得分:0)

我想出了问题所在 -

最初表ApplicationUserRoles只有主键定义,而不是外键映射(多对多映射)..

我在OnModelCreating

中添加了此内容
modelBuilder.Entity<ApplicationUserRole>().HasKey((ApplicationUserRole r) => new { UserId = r.UserId, RoleId = r.RoleId });

//added these definitions
modelBuilder.Entity<ApplicationUser>().HasMany(p => p.Roles).WithRequired().HasForeignKey(p => p.UserId);
modelBuilder.Entity<ApplicationRole>().HasMany(p => p.Users).WithRequired().HasForeignKey(p => p.RoleId);

这完成了关系,现在我可以在Users下看到Roles,反之亦然。

这会在更新数据库时出现问题,但我只需要在迁移中做一些更改 -

  

对象'PK_Dbo.ApplicationUserRole'依赖于列   '用户身份'。 ALTER TABLE DROP COLUMN UserId失败,因为一个或多个   对象访问此列。

我所做的就是,我转到了迁移文件,并将这些行移到了DropColumn

之上
DropIndex("dbo.ApplicationUserRole", new[] { "ApplicationUser_Id" });
DropIndex("dbo.ApplicationUserRole", new[] { "ApplicationRole_Id" });
DropPrimaryKey("dbo.ApplicationUserRole");

这也解决了update-database例外情况。

的Rahul