在本文之后,我已经使用一些自定义属性实现了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");
。
这可能是什么地方出了问题?
拉胡尔
我弄清楚问题出在哪里-
最初,表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”取决于列“ UserId”。ALTER TABLE DROP COLUMN UserId失败,因为一个或多个对象访问此列。
我所做的就是,转到迁移文件并将这些行移至上方 DropColumn
DropIndex("dbo.ApplicationUserRole", new[] { "ApplicationUser_Id" });
DropIndex("dbo.ApplicationUserRole", new[] { "ApplicationRole_Id" });
DropPrimaryKey("dbo.ApplicationUserRole");
这也解决了update-database
异常。
拉胡尔
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句