Почему этот код обновляет адрес электронной почты пользователя в Asp.Net Identity, вызывая дублирование первичного ключа? - PullRequest
0 голосов
/ 01 июня 2018

У меня есть этот код для обновления адреса электронной почты с помощью UserManager платформы Identity:

UserManager<ApplicationUser> UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(ApplicationDbContext.Create()));
ApplicationUser user = await UserManager.FindByNameAsync(username);
IdentityResult result = null;
if (user != null)
{
    user.Email="foo";
    result = await UserManager.UpdateAsync(user);
}

, однако, всякий раз, когда я пытаюсь запустить его, он выдает эту ошибку:

Система.InvalidOperationException: присоединение объекта типа «ApplicationUser» завершилось неудачно, поскольку другой объект того же типа уже имеет такое же значение первичного ключа.Это может произойти при использовании метода «Присоединить» или установке состояния объекта на «Неизменен» или «Изменен», если какие-либо объекты в графе имеют конфликтующие значения ключей.Это может быть потому, что некоторые объекты являются новыми и еще не получили сгенерированные базой данных значения ключей.В этом случае используйте метод «Добавить» или «Добавленный» объект сущности для отслеживания графика, а затем установите для состояния не новых объектов «Неизмененный» или «Измененный», в зависимости от ситуации.

По большей части я просто использую готовую инфраструктуру идентификации, как это показано в шаблоне MVC по умолчанию в Visual Studio.Нет пользовательских магазинов или ничего.Я не уверен, что я делаю здесь не так.

1 Ответ

0 голосов
/ 01 июня 2018

Попробуйте изменить состояние вашей сущности на Изменено следующим образом:

var context = ApplicationDbContext.Create();
UserManager<ApplicationUser> UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
ApplicationUser user = await UserManager.FindByNameAsync(username);
IdentityResult result = null;
if (user != null)
{
    context.Entry(user).State = System.Data.EntityState.Modified;
    user.Email="foo";
    result = await UserManager.UpdateAsync(user);
}
...