2017-08-01 280 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() 
}