![](/img/trans.png)
[英]The instance of entity type 'Entity' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked
[英]The instance of entity type 'IdentityUser' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked
我正在使用 as.net core Identity 来处理用户,我正在尝试使用 ResetPasswordAsync() 方法更新密码,但我收到错误消息
无法跟踪实体类型“CustomUser”的实例,因为已跟踪另一个具有与 {'Id'} 相同键值的实例。
CustomUser 是继承自 IdentityUser 的 class
这个错误的原因可能是因为我在更新之前查询用户,但我不知道问题是什么,因为我使用的是 AsNoTracking()。 所以我认为问题可能与 IdentityUser class 更相关。
这是代码:
public async Task<bool> UpdatePassword(int userId, string token, string password)
{
var user = await _context.Users.AsNoTracking().FirstOrDefaultAsync(x => x.Id == userId);
var results = await _userManager.ResetPasswordAsync(user, token, password);
return true;
}
在此之前调用的代码:
public async Task<bool> SendForgetPasswordEmail(string username) {
var user = await _context.Users.AsNoTracking().FirstOrDefaultAsync(x => x.UserName == userName);
var token = await _userManager.GeneratePasswordResetTokenAsync(user);
var mailServiceVars = _configuration.GetSection("MailService");
var usernameMail = mailServiceVars["Username"];
var passwordMail = mailServiceVars["Password"];
var mailService = new MailService("smtp.gmail.com", usernameMail, passwordMail);
mailService.SendEmail(
username,
"Recover your Password",
string.Concat("https://localhost:44374/resetPassword?token=", token),
string.Empty
);
return true;
}
_context是一个dbContext,继承了Entity的IdentityDbContext class。
_userManager 是 AspNetCore.Identity 库中的 UserManager class。
_contex、_configuration 和_userManager 通过依赖注入进行初始化。
我使用 _context 访问的用户表是使用身份库创建的。
如果您还有其他问题或需要更多信息,请告诉我。 这是我的代码的简化版本。
所以事实证明我找到了修复它的方法。 在这里只使用 _userManager 而不是 _context:
var user = await _context.Users.AsNoTracking().FirstOrDefaultAsync(x => x.Id == userId);
所以代码将是
public async Task<bool> UpdatePassword(int userId, string token, string password)
{
var user = await _userManager.Users.FirstOrDefaultAsync(x => x.Id == userId);
var results = await _userManager.ResetPasswordAsync(user, token, password);
return true;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.