繁体   English   中英

无法跟踪实体类型“IdentityUser”的实例,因为已跟踪另一个具有与 {'Id'} 相同键值的实例

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM