Asp.net Identity 2.0 更新用户

Posted

技术标签:

【中文标题】Asp.net Identity 2.0 更新用户【英文标题】:Asp.net Identity 2.0 update user 【发布时间】:2014-05-15 09:56:41 【问题描述】:

将用户更改保存到数据库时遇到问题,例如更改人名。我正在使用使用个人身份验证在新的 VS2013 Web 项目中自动创建的 IdentityModel。遗憾的是,除了更改角色之外,该模板不允许您更改任何用户信息。我正在通过谷歌四处寻找,我没有找到太多。有人使用基本身份代码实现更新吗?

这是我找到的最接近的东西:

Updating user data - Asp.net Identity

我没有成功合并默认模板。我这周刚开始使用 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”的实体失败,因为同一类型的另一个实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新实体,尚未收到数据库生成的键值。在这种情况下,使用 'Add' 方法或 'Added' 实体状态来跟踪图形,然后将非新实体的状态适当地设置为 'Unchanged' 或 'Modified'

谢谢

【问题讨论】:

如果您确切地提到您遇到问题的原因可能会有所帮助...您尝试了什么?什么没用?错误是什么?结果如何?尽可能具体。 在我的操作中,我正在创建一个 ApplicationUser,并填写了 ID 和其他字段。然后我打电话: 你可以看看我在ASP.NET MVC - Attaching an entity of type 'MODELNAME' failed because another entity of the same type already has the same primary key value上的回答。 【参考方案1】:

我遇到的问题是我创建了一个 ApplicationUser 并将对象保存到数据库中。由于 Identity 在幕后使用实体框架,因此添加了“updatedUser”对象的实体状态。所以实体框架试图插入到身份数据库中,导致冲突。因此,您必须获取用户并更新 返回的用户对象,以便 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);

【讨论】:

在尝试找出我的用户不更新的原因将近 3 天后,我偶然发现了许多答案和方法。你的我的朋友完全有道理,让我更加悲伤......为此,我的朋友,你赢得了互联网! 嗨,我做了同样的事情,但仍然遇到同样的错误。有什么想法吗? 好的,确认一下。您获取用户并验证您可以看到信息。然后你改变了一些字段,比如名字。最后你保存了它。这是一个正确的总结吗?还有你更新了哪个字段? 我也在做同样的事情,唯一的区别是我首先获取用户,然后将其传递给另一个我正在更改详细信息并尝试更新的函数..主要问题是这个错误不是每次都发生……它是在后面。 :( 我已尝试实施此解决方案来更新用户,但在 UserManager 对象上出现“参数数量不正确”错误。我不明白在这种情况下这是如何工作的,除非自发布此解决方案以来发生重大变化。【参考方案2】:

您还可以使用 AuthContext 并将状态更新为 EntityState.Modified。下面是一个例子。这将允许您只调用一次数据库而不是两次。

AuthContext authContext = new AuthContext(); authContext.Entry(updatedUser).State = EntityState.Modified;

【讨论】:

以上是关于Asp.net Identity 2.0 更新用户的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Identity 2.0 注销不起作用

迁移到 Asp.Net Identity 2.0:未在 AspNetUsers 表中创建新列

Asp.net Core 2.0 Identity.TwoFactorRememberMe 到期

如何在现有数据库中实现 ASP.NET Identity 2.0?

ASP.NET Identity 2.0 解密 Owin cookie

Asp.NET Core 2.0 API 控制器中的 User.Identity.Name 为空