Обновление пользователя с помощью 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);