首页 > 解决方案 > 为什么此代码会在 Asp.Net Identity 中更新用户的电子邮件地址导致主键重复?

问题描述

我有这段代码可以使用 Identity 框架的 UserManager 更新电子邮件地址:

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);
}

但是,每当我尝试运行它时,它都会引发此错误:

System.InvalidOperationException:附加类型为“ApplicationUser”的实体失败,因为同一类型的另一个实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新实体,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。

在大多数情况下,我只是使用开箱即用的身份框架,因为它出现在 Visual Studio 的默认 MVC 模板中。没有自定义用户商店或任何东西。我不确定我在这里做错了什么。

标签: c#asp.net-mvcentity-frameworkasp.net-identity

解决方案


尝试将实体的状态更改为已修改,如下所示:

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);
}

推荐阅读