Asp.net Identity 2.0 更新用户

23

我有一个问题,无法将用户更改保存到数据库中,比如更改人的名字。我正在使用IdentityModel,这是在使用个人身份验证的新VS2013 Web项目中自动创建的。不幸的是,该模板不允许您更改任何用户信息,除了更改角色。我通过谷歌搜索,没有找到太多信息。是否有人使用基本身份代码实现了更新?

以下是我找到的最相关内容:

更新用户数据 - 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'的实体失败,因为另一个具有相同主键值的实体已经存在。当使用“Attach”方法或将实体状态设置为“未更改”或“已修改”时,如果图表中的任何实体具有冲突的键值,则可能会发生这种情况。这可能是因为某些实体是新的,并且尚未收到数据库生成的键值。在这种情况下,请使用“Add”方法或“Added”实体状态来跟踪图表,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。谢谢。

如果您能具体说明遇到了什么问题,那将会很有帮助……您尝试了什么?哪些方面出现了问题?错误信息是什么?结果如何?请尽可能详细地描述。 - Erik Funkenbusch
在我的操作中,我正在创建一个ApplicationUser,填写了ID和其他字段。然后我调用: - BCarlson
2个回答

47

我遇到的问题是我创建了一个ApplicationUser对象并将其保存到数据库中。由于Identity在底层使用Entity Framework,因此“updatedUser”对象的实体状态为Added。因此,Entity Framework尝试将其插入到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);

3
经过将近三天的尝试,我一直在寻找为什么我的用户无法更新的原因,我发现了许多答案和方法。朋友,你的方法非常有道理,让我免受进一步烦恼... 因此,我的朋友,你赢得了互联网! - devfunkd
2
嗨,我也做了同样的事情,但仍然遇到相同的错误。有什么想法吗? - user123456
好的,确认一下。您获取了用户并验证了您可以查看信息。然后您更改了一些字段,比如名字(FirstName)。最后您保存了它。这是正确的总结吗?另外,您更新了哪个字段? - BCarlson
我正在做同样的事情,唯一的区别是我首先获取用户,然后将其传递到另一个函数中,在那里我更改详细信息并尝试更新..而主要问题是这个错误不是每次都发生...它很少出现。:( - NMathur
我尝试实现更新用户的解决方案,但在UserManager对象上出现“参数数量不正确”的错误。除非自此解决方案发布以来有重大更改,否则我不明白它在这种情况下如何工作。 - Alex

0
您还可以使用AuthContext并将状态更新为EntityState.Modified。以下是一个示例。这将使您只需调用一次DB而不是两次。 AuthContext authContext = new AuthContext(); authContext.Entry(updatedUser).State = EntityState.Modified;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接