如何迭代用户列表、更改变量和保存到数据库

本文关键字:变量 改变 保存 数据库 列表 何迭代 迭代 用户 | 更新日期: 2023-09-27 18:25:22

我是Identity、EF6和SQL数据库的新手。请耐心等待。

其想法是:对于数据库中的每个用户,更改一个用户变量,然后保存该用户。然而,我一定是做得不对,因为我遇到了InvalidOperationException(臭名昭著的:附加类型为"Models.ApplicationUser"的实体失败,因为同一类型的另一个实体已经具有相同的主键值。

var _db = new ApplicationDbContext();
IQueryable<ApplicationUser> query = _db.Users; // from IdentityDbContext
// search for matching user
List<ApplicationUser> subordinates = query.Where(p => (p.ParentId == userEmployeeId)).ToList();
if (subordinates != null)
{
  foreach (var sub in subordinates)
  {
    sub.Nickname = "Scooby"; // change an example test variable
    IdentityResult result = manager.Update(sub); // EXCEPTION here! Boom.
    if (!result.Succeeded)
    {
      Console.WriteLine("User did not save");
    }
  }
}

Q: 我在这里做错了什么?或者,我应该如何以不同的方式对此进行攻击?

如何迭代用户列表、更改变量和保存到数据库

假设manager是ASP的一个实例。NET Identity UserManager,错误是因为Update()试图将实体添加到上下文中,而在查询时实体已添加到上下文。

有几种方法可以解决这个问题。一种是直接使用EF更新用户(注意,这会绕过任何通过UserManager保存的逻辑)。。。

foreach (var sub in subordinates)
{
    sub.Nickname = "Scooby"; // change an example test variable
}
_db.SaveChanges();

另一种选择是使用AsNoTracking()来防止在查询过程中将其添加到上下文中。之后,manager.Update(sub)应该工作。。。

List<ApplicationUser> subordinates = query.AsNoTracking()
                                       .Where(p => (p.ParentId == userEmployeeId))
                                       .ToList();