Обновление пользователя с помощью UserManager.Update () in ASP.NET идентичность 2
я использую ASP.NET Identity 2 на и я хочу обновить Student данные с помощью UserManager.Update() метод. Однако, как я наследую от ApplicationUser класс, мне нужна карта Student до ApplicationUser перед вызовом метода update. С другой стороны, при использовании подхода, который я также использовал для создания нового студента, возникает ошибка из-за параллелизма при создании нового экземпляра, а не обновлении. Как мне скучно решать проблему с помощью AutoMapper, мне нужно стабильное исправление для решения проблемы без AutoMapper. Не могли бы вы разъяснить мне, как решить эту проблему? Я передаю StudentViewModel к методу обновления в контроллере, а затем мне нужно сопоставить его со студентом, а затем передать их в UserManager.Update() метод as ApplicationUser. С другой стороны, мне интересно, должен ли я получить и отправить пароль на этапе контроллера вместо того, чтобы переходить к просмотру для обеспечения безопасности? Не могли бы вы также сообщить мне об этой проблеме (во время обновления пользователя я не обновляю пароль, и я должен сохранить пароль пользователя в база данных.) Любая помощь будет оценена.
Классы Сущностей:
public class ApplicationUser : IdentityUser<int, ApplicationUserLogin,
ApplicationUserRole, ApplicationUserClaim>, IUser<int>
{
public string Name { get; set; }
public string Surname { get; set; }
//code omitted for brevity
}
public class Student: ApplicationUser
{
public int? Number { get; set; }
}
:
[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult Update([Bind(Exclude = null)] StudentViewModel model)
{
if (ModelState.IsValid)
{
ApplicationUser user = UserManager.FindById(model.Id);
user = new Student
{
Name = model.Name,
Surname = model.Surname,
UserName = model.UserName,
Email = model.Email,
PhoneNumber = model.PhoneNumber,
Number = model.Number, //custom property
PasswordHash = checkUser.PasswordHash
};
UserManager.Update(user);
}
}
2 ответов
нет необходимости проходить student as ApplicationUser до UserManager.Update() метод (потому что Student класс наследует (отсюда и) ApplicationUser).
проблема с вашим кодом заключается в том, что вы используете new Student оператор, тем самым создавая нового студента, а не обновляя существующий.
измените код следующим образом:
// Get the existing student from the db
var user = (Student)UserManager.FindById(model.Id);
// Update it with the values from the view model
user.Name = model.Name;
user.Surname = model.Surname;
user.UserName = model.UserName;
user.Email = model.Email;
user.PhoneNumber = model.PhoneNumber;
user.Number = model.Number; //custom property
user.PasswordHash = checkUser.PasswordHash;
// Apply the changes if any to the db
UserManager.Update(user);
мой ответ на .netcore 1
эта работа для меня, я надеюсь, может помочь им
var user = await _userManager.FindByIdAsync(applicationUser.Id);
user.ChargeID = applicationUser.ChargeID;
user.CenterID = applicationUser.CenterID;
user.Name = applicationUser.Name;
var result = await _userManager.UpdateAsync(user);