Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP标识角色不存在错误_C#_Asp.net_Asp.net Mvc_Entity Framework_.net Core - Fatal编程技术网

C# ASP标识角色不存在错误

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);

我试图在我的MVC.NET核心应用程序中创建一个页面,用户可以在其中更改其他用户的角色。在这一点上,视图和模型绑定都非常有效,但是当实际尝试将角色保存回数据库时,我得到一个错误,即角色不存在。我的做法是:

  • 从模型中获取角色列表
  • 删除指定用户的现有角色
  • 使用模型中的列表重新添加角色
  • 如果发生错误,请在事务中执行所有操作
  • 我在控制器中的代码如下:

                    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()
    });
    }
    }
    
    我想你是对的,这有点奇怪。我更新了我的帖子以反映这些变化,但是我仍然看到这个角色不存在。这也是我的问题。我对现有角色的解决方案是运行sql
    UPDATE[roles]SET NormalizedName=UPPER(Name)
    我在
    rolemager
    下得到了红色的曲线,rolemager来自哪里?