Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core GetUserIdAsync(用户)返回随机ID_Asp.net Core_Asp.net Core Webapi - Fatal编程技术网

Asp.net core GetUserIdAsync(用户)返回随机ID

Asp.net core GetUserIdAsync(用户)返回随机ID,asp.net-core,asp.net-core-webapi,Asp.net Core,Asp.net Core Webapi,我有asp net core 5 web api和EF core,当我第二次或多次调用userManager.GetUserIdAsync(user)时,每次都会得到一个不同的ID。请参见下面代码中的注释 我的控制器与此类似: 公共异步任务注册([FromBody]userForRegistration到userForRegistration) { IdentityResult result=await_repository.Account.Create(userForRegistration)

我有asp net core 5 web api和EF core,当我第二次或多次调用
userManager.GetUserIdAsync(user)
时,每次都会得到一个不同的ID。请参见下面代码中的注释

我的控制器与此类似:

公共异步任务注册([FromBody]userForRegistration到userForRegistration)
{
IdentityResult result=await_repository.Account.Create(userForRegistration);
var host=$“{HttpContext.Request.Scheme}://{HttpContext.Request.host}”;
wait_repository.Account.GenerateEmailConfirmation(主机、用户注册);
返回状态码(201);
}
还有一个类似于此的存储库:

公共异步任务创建(userForRegistration到userForRegistration)
{
var user=new user{UserName=userForRegistration.Email,Email=userForRegistration.Email};
var user2=new User{UserName=userForRegistration.Email,Email=userForRegistration.Email};//用于测试
var result=await\u userManager.CreateAsync(user,userForRegistration.Password);
var userId=await _userManager.GetUserIdAsync(user);//此ID与数据库中的ID相同,因此工作正常
var userId2=await _userManager.GetUserIdAsync(user2);//此ID现在看起来是随机的,不在数据库中,甚至使用完全相同的用户数据。
wait_userManager.AddToRoleAsync(用户,“访问者”);
返回结果;
}
公共异步任务GenerateEmailConfirmation(字符串hostUrl,userForRegistration数据到userForRegistration)
{
var user=new user{UserName=userForRegistration.Email,Email=userForRegistration.Email};
var user2=新用户{UserName=“blabla”};
var userId=await _userManager.GetUserIdAsync(user);//再次使用“随机”ID
var userId2=await _userManager.GetUserIdAsync(user2);//在数据库中不存在,但我得到了一个随机ID
.....
}

有什么想法吗?谢谢

在将用户保存到数据库之前,您似乎试图搜索该用户。 您需要先将用户保存到数据库,例如:

IdentityResult res = await _userManager.CreateAsync(userForRegistration, password);
var user = await _userManager.FindByNameAsync(userForRegistration.UserName);
然后你会发现它是这样的:

IdentityResult res = await _userManager.CreateAsync(userForRegistration, password);
var user = await _userManager.FindByNameAsync(userForRegistration.UserName);

请注意,
Id
属性将被初始化以形成新的GUID字符串值。有关详细信息,您可以查看,如下所示

/// <summary>
/// Initializes a new instance of <see cref="IdentityUser"/>.
/// </summary>
/// <remarks>
/// The Id property is initialized to form a new GUID string value.
/// </remarks>
public IdentityUser()
{
    Id = Guid.NewGuid().ToString();
    SecurityStamp = Guid.NewGuid().ToString();
}

我正在使用CreateAncy,不幸的是,该方法需要是
GetUserIdAsync
(该方法最初在AspNetCore.Identity库中失败,我刚刚将其移出,以便在代码中重新生成)。您需要从数据库加载用户。您可以使用var
userId=(wait\u userManager.FindByNameAsync(userForRegistration.UserName)).Id
GetUserIdAsync
可能需要从数据库加载的用户。您是对的。我非常关注GetUserIdAsync,以至于我没有意识到问题在于每次创建对象时都要创建一个新Id!