Подтвердить что ты не робот

Пользователь обновления 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" не удалось, поскольку другой объект того же типа уже имеет такое же значение первичного ключа. Это может произойти при использовании метода "Прикрепить" или установки состояния объекта в "Без изменений" или "Модифицировано", если любые объекты на графике имеют конфликтующие значения ключей. Это может быть связано с тем, что некоторые объекты являются новыми и еще не получили значения ключей базы данных. В этом случае используйте метод "Добавить" или "Добавленное" состояние объекта для отслеживания графика, а затем установите состояние не новых объектов в "Без изменений" или "Модифицировано", если это необходимо

Спасибо

4b9b3361

Ответ 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;