使用include得不到信息
来源:1-2 【讨论题】对于不断推出的新框架,我们应该如何学习?

慕数据8524399
2023-09-20
我试图自己写一个通过用户ID来得到用户的详细信息。下面是这个方法
public async Task GetUserAsync(string userId)
{
// var user = await _context.Users
//.Include(u => u.UserRoles)
//.FirstOrDefaultAsync(u => u.Id == userId);
var user = await _context.Users.FindAsync(userId);
var userRoles = await _context.UserRoles.FirstOrDefaultAsync(ur => ur.UserId == userId);
if (user != null && userRoles != null)
{
user.UserRoles = new List<IdentityUserRole<string>> { userRoles };
}
return user;
}
我本来打算用上面注释掉的3行来实现,但是用这三行的话,返回的userRoles是空值,就像下面这样
{
"address": null,
"userRoles": [],
"claims": null,
"logins": null,
"tokens": null,
"id": "8CD12B69-FA0A-7B0A-7B4F-7830DDF45769",
"userName": "admin@163.com",
"normalizedUserName": "ADMIN@163.COM",
"email": "admin@163.com",
"normalizedEmail": "ADMIN@163.COM",
"emailConfirmed": false,
"passwordHash": "AQAAAAEAACcQAAAAEIbf7njyXxFmAbw9AHAf7GeQxDMl2hX4xQ09X8DUyJ6vnfZOZROnLnzUBRg/4bX/qQ==",
"securityStamp": "b553bcf0-7605-462a-aa24-5b99b802463f",
"concurrencyStamp": "42ddae96-704f-4ec7-9f0e-821217de8d00",
"phoneNumber": "123456",
"phoneNumberConfirmed": false,
"twoFactorEnabled": false,
"lockoutEnd": null,
"lockoutEnabled": false,
"accessFailedCount": 0
}
而如果是分两次查询就能得到正确的结果,如下:
{
“address”: null,
“userRoles”: [
{
“userId”: “8CD12B69-FA0A-7B0A-7B4F-7830DDF45769”,
“roleId”: “39996f34-013c-4fc6-b1b3-0c1036c47110”
}
],
“claims”: null,
“logins”: null,
“tokens”: null,
“id”: “8CD12B69-FA0A-7B0A-7B4F-7830DDF45769”,
“userName”: "admin@163.com",
“normalizedUserName”: "ADMIN@163.COM",
“email”: "admin@163.com",
“normalizedEmail”: "ADMIN@163.COM",
“emailConfirmed”: false,
“passwordHash”: “AQAAAAEAACcQAAAAEIbf7njyXxFmAbw9AHAf7GeQxDMl2hX4xQ09X8DUyJ6vnfZOZROnLnzUBRg/4bX/qQ==”,
“securityStamp”: “b553bcf0-7605-462a-aa24-5b99b802463f”,
“concurrencyStamp”: “42ddae96-704f-4ec7-9f0e-821217de8d00”,
“phoneNumber”: “123456”,
“phoneNumberConfirmed”: false,
“twoFactorEnabled”: false,
“lockoutEnd”: null,
“lockoutEnabled”: false,
“accessFailedCount”: 0
}
请教老师注释部分为何出错
1回答
-
阿莱克斯刘
2023-09-20
这个问题问得非常好,我也遇到了同样的情况。这是因为asp.net identity 框架的设计所导致的。至于为什么要这样设计,我的理解是identity框架不希望我们通过context来访问数据,他希望我们使用identity 内建的服务方法来访问数据,如,roleManager、userManager 等。00