Я новичок в базе данных 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");
}
}
}
В: Что я здесь делаю неправильно? Или, как я должен атаковать это по-другому?
Предполагая, что 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();