向SignInManager.PasswordSignInAsync()
提供用户名时,首先调用FindByNameAsync()
,然后调用FindByIdAsync()
。我实现了一个自定义UserStore,但我不明白为什么它同时调用两个数据库调用?这似乎是不必要的开销。
在这两种情况下,我都使用不同的Where标准返回相同的IUser对象。那是我应该做的吗?
public Task<MyAppIdentityUser> FindByIdAsync(long userId)
{
Task<MyAppIdentityUser> task = _db.Profile.Where(x => x.UserId == userId)
.Select(x => new MyAppIdentityUser { Id = x.UserId, UserName = x.UserName })
.FirstOrDefaultAsync();
return task;
}
public Task<MyAppIdentityUser> FindByNameAsync(string userName)
{
Task<MyAppIdentityUser> task = _db.Profile.Where(x => x.UserName == userName)
.Select(x => new MyAppIdentityUser { Id = x.UserId, UserName = x.UserName })
.FirstOrDefaultAsync();
return task;
}
附加 - 我还注意到GetPasswordHashAsync()和GetLockoutEnabledAsync()的第3和第4个查询。为什么所有这些呼叫都是必要的,并且不能在一次呼叫中捆绑在一起?
答案 0 :(得分:0)
所以我终于在经过一番头疼之后弄明白了。当使用字符串用户名和密码调用SignInManager.PasswordSignInAsync()
时,它首先查询数据库以从DB(source code)获取具有其Id密钥的IUser对象。然而,它然后再次使用IUser对象调用自身,但是做了几次检查,一遍又一遍地调用GetUserIdAsync()
,尽管经理已经拥有它。不知道为什么开箱即用。