Пользователь обновления Asp.net Identity 2.0
Проблема с сохранением пользовательских изменений в базе данных, например, смена имени пользователя. Я использую IdentityModel, который автоматически создается в новом веб-проекте VS2013 с использованием индивидуальной проверки подлинности. К сожалению, шаблон не позволяет изменять любую пользовательскую информацию, кроме изменения ролей. Я просматриваю через google, я не нашел много. Кто-нибудь реализует обновление с использованием базового идентификационного кода?
Это самая близкая вещь, которую я нашел:
Обновление пользовательских данных - Идентификация Asp.net
Мне не удалось включить шаблон по умолчанию. Я только начал использовать Identity на этой неделе, так что может быть, я не понимаю, что проблема.
var updatedUser = new ApplicationUser
{
Id = model.UserId,
UserName = model.UserName,
CustomerId = model.CustomerId,
Email = model.EmailAddress,
FirstName = model.FirstName,
LastName = model.LastName,
PhoneNumber = model.PhoneNumber,
};
...
var result = await UserManager.UpdateAsync(updatedUser);
Мой UserManager создается следующим образом:
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
В браузере появляется следующая ошибка:
Прикрепление объекта типа "ApplicationUser" не удалось, поскольку другой объект того же типа уже имеет такое же значение первичного ключа. Это может произойти при использовании метода "Прикрепить" или установки состояния объекта в "Без изменений" или "Модифицировано", если любые объекты на графике имеют конфликтующие значения ключей. Это может быть связано с тем, что некоторые объекты являются новыми и еще не получили значения ключей базы данных. В этом случае используйте метод "Добавить" или "Добавленное" состояние объекта для отслеживания графика, а затем установите состояние не новых объектов в "Без изменений" или "Модифицировано", если это необходимо
Спасибо
Ответы
Ответ 1
Проблема была в том, что я создал ApplicationUser и сохранил объект в базе данных. Поскольку Identity использует Entity Framework под обложками, добавляется состояние объекта объекта "updatedUser". Таким образом, Entity Framework попыталась включить INSERT в базу данных Identity, вызвав конфликт. Таким образом, вы должны получить пользователя и обновить возвращаемый объект пользователя для Entity Framework, чтобы узнать, что состояние объекта изменено. Здесь рабочий код:
var user = await UserManager.FindByIdAsync(model.UserId);
user.Email = model.EmailAddress;
user.CustomerId = model.CustomerId;
user.FirstName = model.FirstName;
user.PhoneNumber = model.PhoneNumber;
user.LastName = model.LastName;
var result = await UserManager.UpdateAsync(user);
Ответ 2
Вы также можете использовать AuthContext и обновить состояние до EntityState.Modified. Ниже приведен пример. Это позволит вам сделать только один вызов в БД вместо двух.
AuthContext authContext = new AuthContext();
authContext.Entry(updatedUser).State = EntityState.Modified;