我已经在本文后面的一些自定义属性中实现了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。
答案 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