Entity framework 未填充标识角色

Entity framework 未填充标识角色,entity-framework,asp.net-core,identity,Entity Framework,Asp.net Core,Identity,我有一个简单的沙箱项目,我正在使用它来更好地理解.net核心标识是如何工作的,我遇到了一些不一致的地方,我希望有人能解释一下。该项目使用实体框架 我用这篇很棒的文章来帮助我设置项目,我的用户类如下 public class User : IdentityUser<int> { public string FirstName { get; set; } public string LastName { get; set; } public string Temp

我有一个简单的沙箱项目,我正在使用它来更好地理解.net核心标识是如何工作的,我遇到了一些不一致的地方,我希望有人能解释一下。该项目使用实体框架

我用这篇很棒的文章来帮助我设置项目,我的用户类如下

public class User : IdentityUser<int>
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string TempPassword { get; set; }
}
因此,我的属性如
[Authorize(“Admin”)]
非常有效。我甚至添加了一些主要的扩展

public static class PrincipalExtensions
{
    public static bool IsOwner(this ClaimsPrincipal principal)
    {
        return principal.IsInRole("Owner");
    }

    public static bool IsAdmin(this ClaimsPrincipal principal)
    {
        return principal.IsInRole("Admin") || principal.IsInRole("Owner");
    }

    public static bool IsUser(this ClaimsPrincipal principal)
    {
        return principal.Identity.IsAuthenticated;
    }
}
所以我可以做
if(User.IsAdmin())
,这也非常有效

这就是它变得奇怪的地方

如果我单步执行以下代码,就会得到令人困惑的结果

var user = await _userManager.GetUserAsync(User);            
var userRoles = await _userManager.GetRolesAsync(user);
await _userManager.AddToRoleAsync(user, "Owner");
第一行为主体获取一个
User
对象。在该对象上有他的角色集合,
user.Roles
,但即使用户确实有角色,它也将显示为空(Count=0)

第二行获取用户的
角色
,并正确填充

第三行向用户添加了“所有者”角色,该角色工作正常(数据库已更新),但局部变量
user
现在突然在
user.Roles
中具有该角色!注意,不会显示用户的其他角色,只显示该角色

所以我基本上有两个问题:1。为什么
user
对象一开始没有填充
user.Roles
?2.为什么在我添加角色后会突然同步


非常感谢您的帮助。

您的
角色
集合在调用
GetUserAsync()
后不会填充,因为不会请求信息。这相当于直接通过
DbContext
访问用户数据,而不调用
Include()

现在,因此不会自动填充
user.Roles
导航属性。是的,这使得目前的行为有些虚伪


在对
GetRolesAsync()
AddToRoleAsync()
的调用中,数据将为您显式填充,因为您直接对角色进行操作。

感谢链接。起初我只是想说“如果他们不打算填充它,为什么他们会把它放在对象上”,但在该页面的待办事项部分,它说它会来。呵呵,最好的是,
user。角色是只读的,所以我自己都无法填充它!
var user = await _userManager.GetUserAsync(User);            
var userRoles = await _userManager.GetRolesAsync(user);
await _userManager.AddToRoleAsync(user, "Owner");