C# ASP标识角色不存在错误
我试图在我的MVC.NET核心应用程序中创建一个页面,用户可以在其中更改其他用户的角色。在这一点上,视图和模型绑定都非常有效,但是当实际尝试将角色保存回数据库时,我得到一个错误,即角色不存在。我的做法是:C# ASP标识角色不存在错误,c#,asp.net,asp.net-mvc,entity-framework,.net-core,C#,Asp.net,Asp.net Mvc,Entity Framework,.net Core,我试图在我的MVC.NET核心应用程序中创建一个页面,用户可以在其中更改其他用户的角色。在这一点上,视图和模型绑定都非常有效,但是当实际尝试将角色保存回数据库时,我得到一个错误,即角色不存在。我的做法是: 从模型中获取角色列表 删除指定用户的现有角色 使用模型中的列表重新添加角色 如果发生错误,请在事务中执行所有操作 我在控制器中的代码如下: var user = await _userManager.FindByIdAsync(id);
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
作为角色的列表。奇怪的是,这个过程在\u 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 ---
InvalidOperationException:角色管理员不存在。
Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`4.事实上,我很惊讶您没有得到无效的CastException
,因为无法直接将字符串[]
强制转换为列表
。首先,我不太清楚你为什么要这样做,因为如果你想要一个列表,你可以很容易地调用.ToList()
,而不是.ToArray()
,然后再调用一天。或者,由于GetRolesAsync
的返回类型是IList
,因此,您甚至不需要这样做。现在,这是我在代码中看到的唯一问题。当您尝试向角色添加用户时,它首先尝试查找角色。在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()
});
}
}
/*创建角色*/
IEnumerable allRoles=Enum.GetValues(typeof(UserRole)).Cast();
foreach(所有角色中的用户角色)
{
如果(!wait roleManager.RoleExistsAsync(role.ToString()))
{
wait rolemager.CreateAsync(新的IdentityRole{
Name=role.ToString(),
NormalizedName=role.ToString().ToUpper()
});
}
}
我想你是对的,这有点奇怪。我更新了我的帖子以反映这些变化,但是我仍然看到这个角色不存在。这也是我的问题。我对现有角色的解决方案是运行sqlUPDATE[roles]SET NormalizedName=UPPER(Name)
我在rolemager
下得到了红色的曲线,rolemager来自哪里?