c# - 为什么此代码会在 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 模板中。没有自定义用户商店或任何东西。我不确定我在这里做错了什么。
解决方案
尝试将实体的状态更改为已修改,如下所示:
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);
}
推荐阅读
- macos - MacOS - 此磁盘不使用 GUID 分区表方案错误
- sql - 是否可以通过 ping 网站获得一些有用的信息?
- php - 执行 pdo insert 排除某些参数
- python - Python - 为未指定的输入创建通用函数
- opacity - Mayavi mlab_source.set 不透明度不起作用
- c - 错误:在参数列表中声明的“struct addrinfo”在此定义或声明之外将不可见 [-Werror]|
- javascript - 如何在 bootstrap vue 的卡片组组中制作滑块?
- mongodb - 使用 MDBC 和 Powershell 将日期导入 Mongodb
- php - 如何在端口而不是 htdocs 文件夹中运行 PHP 应用程序?
- delphi - 从 FireDac Explorer 到示例 Employee.gdb 的连接不成功