Как перебрать список пользователей, изменить переменную и сохранить в базе данных?

1

Я новичок в базе данных 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");
    }
  }
}

В: Что я здесь делаю неправильно? Или, как я должен атаковать это по-другому?

Теги:
entity-framework
asp.net-identity

1 ответ

0
Лучший ответ

Предполагая, что 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();
  • 0
    Спасибо, Энтони. Использование manager.Update () использует другой контекст (негласно), чем _db. Таким образом, вызов manager.Update () был не тем, что мне нужно, а _db.SaveChanges ();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню