如何迭代用户列表、更改变量和保存到数据库
本文关键字:变量 改变 保存 数据库 列表 何迭代 迭代 用户 | 更新日期: 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();