ASP.Net身份,角色中的用户始终为空
ASP.Net identity, Users in role are always empty
我已经在这篇文章之后使用一些自定义属性实现了 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
是扩展查询 DbSet<ApplicationUser>
.
的 IRepository 的服务
我可以在 table ApplicationUserRoles
中看到正确映射的角色,并且当我这样做时我得到了预期的结果 _userManager.IsInRole(user.Id, "Admin");
。
这可能出了什么问题?
拉胡尔。
如果您正在使用 Entity Framework,这听起来像是您被延迟加载捕获了(因为角色正在添加到数据库中,而不是在从可查询请求时添加)。
尝试如下操作:
_userManager.Users.Include(x => x.Roles).Where(m => m.Roles.Any(r => r.RoleId == userRole.Id));
我知道问题出在哪里了 -
最初 table 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);
这完成了关系,现在我可以在 Roles
下看到 Users
,反之亦然。
这在更新数据库时导致了问题,但是我只需要在迁移中做一些更改 -
The object 'PK_Dbo.ApplicationUserRole' is dependent on column
'UserId'. ALTER TABLE DROP COLUMN UserId failed because one or more
objects access this column.
我所做的就是转到迁移文件并将这些行移到 DropColumn
上方
DropIndex("dbo.ApplicationUserRole", new[] { "ApplicationUser_Id" });
DropIndex("dbo.ApplicationUserRole", new[] { "ApplicationRole_Id" });
DropPrimaryKey("dbo.ApplicationUserRole");
这也解决了 update-database
异常。
拉胡尔
我已经在这篇文章之后使用一些自定义属性实现了 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
是扩展查询 DbSet<ApplicationUser>
.
我可以在 table ApplicationUserRoles
中看到正确映射的角色,并且当我这样做时我得到了预期的结果 _userManager.IsInRole(user.Id, "Admin");
。
这可能出了什么问题?
拉胡尔。
如果您正在使用 Entity Framework,这听起来像是您被延迟加载捕获了(因为角色正在添加到数据库中,而不是在从可查询请求时添加)。
尝试如下操作:
_userManager.Users.Include(x => x.Roles).Where(m => m.Roles.Any(r => r.RoleId == userRole.Id));
我知道问题出在哪里了 -
最初 table 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);
这完成了关系,现在我可以在 Roles
下看到 Users
,反之亦然。
这在更新数据库时导致了问题,但是我只需要在迁移中做一些更改 -
The object 'PK_Dbo.ApplicationUserRole' is dependent on column 'UserId'. ALTER TABLE DROP COLUMN UserId failed because one or more objects access this column.
我所做的就是转到迁移文件并将这些行移到 DropColumn
DropIndex("dbo.ApplicationUserRole", new[] { "ApplicationUser_Id" });
DropIndex("dbo.ApplicationUserRole", new[] { "ApplicationRole_Id" });
DropPrimaryKey("dbo.ApplicationUserRole");
这也解决了 update-database
异常。
拉胡尔