2014-04-03 99 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;

相關問題