2017-08-01 276 views
1

您好我正在建立一个使用身份与自定义用户类和EF核心的API。 我想获得属于用户的角色的名称。 表的图是下面的(忽略userclaims和userlogins): enter image description hereASP.Net核心如何获得EF核心和身份的用户角色

正如你可以看到角色和用户是N到N使内部身份做了一个结表命名的UserRole,我的位指示如下:

Route ("api/[controller]")] 
    public class UserController : Controller { 
     private readonly DBContext _db; 
     private readonly UserManager<Usuario> _userManager; 
     public UserController (DBContext db, UserManager<Usuario> userManager) { 
      this._db = db; 
     } 
     [HttpGet ("GetUserById/{id}", Name = "GetUserById")] 
     public async Task<IActionResult> GetUserById (string id) { 
      try { 

       var user = await this._db.Users.Where (x => x.Id == id).Include (x => x.Roles).FirstOrDefaultAsync(); 
       if (user == null) { 
        return NotFound(); 
       } 
       return Ok (user); 
      } catch (Exception e) { 
       Console.WriteLine (e.Message); 
       return BadRequest(); 
      } 
     } 

当我在邮差把它称为我得到如下回应:

enter image description here

正如你可以在R见我所得到的所有部分是:

"roles": [ 
     { 
      "userId": "d88b0c2d-25c5-4da9-ad05-45f69dec67ff", 
      "roleId": "a83a60ca-f011-43ce-be3d-8b71403aa86e" 
     } 
    ] 

该数据属于联结表而不是角色表本身,我不希望这样。

我真正想要的是“真正的”角色表数据,任何想法我怎么能做到这一点?

在SQL它会是这样的:

select * 
    from AspNetUsers as a,AspNetUserRoles as b,AspNetRoles as c 
    where a.Id = b.UserId and b.RoleId= c.Id 

回答

3
var user = await _userManager.FindByIdAsync(UserId); 
var roles = await _userManager.GetRolesAsync(user); 

return OK(new { User = user, Roles = roles }); 

这会产生角色名称,无论哪种方式,只有这样,才能得到这回你的API调用返回一个视图模型或其他选项,克里斯指出它不可能直接调用..它的实现如此之小。

无论如何,这是获得“角色”名称而不必触摸你的数据库上下文的第二种选择。

如果您希望Id'sRoleManager<IdentityRole>拉或从您的dbcontext。

呼叫它Roles在你做什么可能会造成干扰,因为roles[]已经存在于User的返回。

1

不幸的是,有没有导航性能上UserRole,所以这是一个手动的事。您需要执行以下操作:

var userRoleIds = user.Roles.Select(r => r.RoleId); 
var roles = db.Roles.Where(r => userRoleIds.Contains(r.Id)); 

然后,您可以通过视图模型将这些映射到用户。例如:

public class UserViewModel 
{ 
    ... 
    public List<string> Roles { get; set; } 
} 

然后:

var model = new UserViewModel 
{ 
    ... 
    Roles = roles.Select(r => r.Name).ToList() 
}