2014-04-03 70 views
20

保存用户对数据库的更改(如更改人员姓名)存在问题。我正在使用在使用个人身份验证的新VS2013 Web项目中自动创建的IdentityModel。可悲的是,该模板不允许您更改任何用户信息,而不是更改角色。我通过谷歌环顾四周,我没有找到太多。任何人都使用基本身份代码实现更新?Asp.net Identity 2.0更新用户

这是我发现的最接近的事:

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”,因为同类型的其他实体失败已具有相同的主键值。如果图中的任何实体具有冲突的键值,则使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时可能会发生这种情况。这可能是因为一些实体是新的并且还没有收到数据库生成的关键值。在这种情况下使用的“添加”方法或“添加”实体状态追踪图形,然后设置非新实体的状态设置为“未改变”或“修饰的”酌情

由于

+0

如果您确切地提到了您的问题,您可能会有所帮助......您尝试了什么?什么没有用?错误是什么?结果是什么?尽可能具体。 –

+0

在我的操作中,我创建了一个ApplicationUser,并填写了ID和其他字段。然后我打电话: – BCarlson

+0

你可能看看我对[ASP.NET MVC]的回答 - 附加一个'MODELNAME'类型的实体失败,因为另一个相同类型的实体已经具有相同的主键值](http:// stackoverflow的.com /问题/ 23201907/ASP净MVC附着-AN-实体的型MODELNAME失败的 - 因为-另一个-ENT/39557606#39557606)。 –

回答

39

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

经过近3天的试图弄清楚为什么我的用户不会更新,我偶然发现了很多答案和方法。您的朋友是完全有道理的,并为我挽救了更多的悲伤......因为这个我的朋友,您赢得了互联网! – devfunkd

+2

嗨,我做了同样的,仍然得到相同的错误。任何想法 ? – user123456

+0

好的,确认。你得到用户并验证你可以看到这些信息。然后你改变了一些字段,如FirstName。最后你保存了它。这是一个正确的总结吗?您还更新了哪个字段? – BCarlson

0

您也可以使用AuthContext并将状态更新为EntityState.Modified。下面是一个例子。这将允许您只拨打一个电话给数据库而不是两个。

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

相关问题