c# – ASP标识角色不存在错误
发布时间:2020-12-15 23:33:35 所属栏目:百科 来源:网络整理
导读:我正在尝试在我的MVC .NET CORE应用程序中创建一个页面,用户可以在其中更改其他用户的角色.此时视图和模型绑定都很有效,但是当实际尝试将角色保存回数据库时,我收到一条错误消息,指出角色不存在.我的方法是: 从模型中获取角色列表. 删除指定用户的现有角色.
我正在尝试在我的MVC .NET CORE应用程序中创建一个页面,用户可以在其中更改其他用户的角色.此时视图和模型绑定都很有效,但是当实际尝试将角色保存回数据库时,我收到一条错误消息,指出角色不存在.我的方法是:
>从模型中获取角色列表. 我在控制器中的代码如下: 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类并使用ef,但没有运气.我还验证了模型中的角色与数据库中的角色匹配.是否有任何明显错误会导致失败?谢谢. 编辑 这是我遇到的错误: 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 --- 以下是我的数据库中定义的角色: 解决方法
当您尝试将用户添加到角色时,它首先尝试查找角色.在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字段设置为Name字段的大写: 所以在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() }); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |