2016-06-22 61 views
3

我想在我的MVC .NET CORE應用程序中創建一個頁面,其中用戶可以更改其他用戶的角色。在這一點上,視圖和模型綁定都很好,但是當實際嘗試將角色保存回數據庫時,我收到一個錯誤,指出角色不存在。我的方法是:ASP身份角色不存在錯誤

  1. 從模型中獲取角色列表。
  2. 刪除指定用戶的現有角色。
  3. 使用模型中的列表添加角色。
  4. 如果發生錯誤,請在交易中完成所有操作。

我在控制器代碼如下:

   var user = await _userManager.FindByIdAsync(id); 

       if (user == null) 
       { 
        return View("Error"); 
       } 

       using (_context.Database.BeginTransaction()) 
       { 
        var removeResult = await _userManager.RemoveFromRolesAsync(user, await _userManager.GetRolesAsync(user)); 
        if (!removeResult.Succeeded) 
        { 
         return View("Error"); 
        } 

        var addResult = await _userManager.AddToRolesAsync(user, model.MemberRoles); 
        if (!addResult.Succeeded) 
        { 
         return View("Error"); 
        } 
       } 

model.MemberRoles角色作爲List<string>。奇怪的部分是這個過程在_userManager.RemoveFromRolesAsync上失敗,即使我將用戶的現有角色直接傳遞給函數。我曾嘗試拋棄UserManager課程,但是卻沒有運氣。我還驗證了模型中的角色與數據庫中的角色相匹配。有什麼明顯的錯誤會導致失敗嗎?謝謝。

編輯

以下是錯誤我遇到:

InvalidOperationException: Role ADMINISTRATOR does not exist. 
Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`4.<AddToRoleAsync>d__32.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 

,這裏是角色在我的數據庫定義:

enter image description here

回答

2

實際上,我感到驚訝,你沒有得到一個InvalidCastException,因爲它是不可能直接投string[]List<string>。不知道爲什麼你要這樣做,因爲你可以簡單地調用.ToList()而不是.ToArray(),並且如果你想要一個列表,可以稱它爲一天。或者,由於GetRolesAsync的返回類型爲IList<string>,無論如何,您甚至不需要那樣做。現在,這是我在代碼中看到的唯一問題。

+0

我想你是對的那有點奇怪。我更新了我的帖子以反映這些更改,但我仍然看到該角色不存在。 –

3

當您嘗試將用戶添加到某個角色時,它首先會嘗試查找該角色。在Sql Profiler中,您可以看到它實際上是通過NormalizedName字段而不是Name字段進行搜索的。

exec sp_executesql N' 
SELECT TOP(2) [r].[Id], [r].[ConcurrencyStamp], [r].[Name], [r].[NormalizedName] 
FROM [AspNetRoles] AS [r] 
WHERE [r].[NormalizedName] = @__normalizedRoleName_0',N'@__normalizedRoleName_0 nvarchar(256)',@__normalizedRoleName_0=N'ADMINISTRATOR' 

的解決方案是在創建角色的NormalizedName字段設置爲名稱字段的大寫:

所以在SeedData類:

/* Create Roles */ 
IEnumerable<UserRole> allRoles = Enum.GetValues(typeof(UserRole)).Cast<UserRole>(); 


foreach (UserRole role in allRoles) 
{ 
    if (!await roleManager.RoleExistsAsync(role.ToString())) 
    { 
       await roleManager.CreateAsync(new IdentityRole { 
          Name = role.ToString(), 
          NormalizedName = role.ToString().ToUpper() 
         }); 
    } 
} 
+0

這也是我的問題。我現有角色的解決方案是運行sql'UPDATE [角色] SET NormalizedName = UPPER(Name)' – Michael

相關問題