2016-09-15 147 views
3

我正在使用.NET Core,Identity Core和MVC Core创建用户注册系统。我能够创建用户并在数据库中创建角色。userManager.AddToRoleAsync() - 错误:角色不存在

下面是关于视图的形式,让我选择一个用户,然后选择一个角色添加:

@using (Html.BeginForm("AddRoleToUser", "Roles")) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <p> 
     Username : @Html.DropDownList("UserName", (IEnumerable<SelectListItem>)ViewBag.Users, "Select ...") 
     Role Name: @Html.DropDownList("RoleName", (IEnumerable<SelectListItem>)ViewBag.Roles, "Select ...") 

    </p> 

    <input type="submit" value="Save" /> 
} 

这些下拉列表中填充与已经存在于数据库中的用户和角色。他们允许我选择User s和名称我已经创建的角色。例如,我有一个名为“admin”的角色,这个表单让我选择字符串“admin”。

下面是处理添加角色给用户的动作:“不存在‘

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> AddRoleToUser(string UserName, string RoleName) 
    { 
     try 
     { 
      ApplicationUser user = _db.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault(); 
      await _userManager.AddToRoleAsync(user, RoleName); 
      PrepopulateDropDownMenus(); 
      ViewBag.ResultMessage = "Role created successfully!"; 
      return View("Manage", "Roles"); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
      return View("Manage"); 
     } 
    } 

的行动从未添加角色给用户,异常写着’角色” ADMIN没有内在的例外。我尝试将动作参数中的RoleName转换为全部大写,但它仍未找到角色。我也尝试使用角色ID而不是名称,这也是不成功的。

当我使用Identity 3.0与MVC 6构建此应用程序时,此确切代码有效。似乎在向Identity Core移动时发生了某些变化。

有什么想法?

编辑

下面是我用填充下拉列表通过Viewbag的代码RolesController

private void PrepopulateDropDownMenus() 
    { 
     var rolesList = _db.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList(); 
     var usersList = _db.Users.OrderBy(u => u.UserName).ToList().Select(uu => new SelectListItem { Value = uu.UserName.ToString(), Text = uu.UserName }).ToList(); 
     ViewBag.Roles = rolesList; 
     ViewBag.Users = usersList; 
    } 

以下是我在添加身份Startup.csConfigureServices方法:

public void ConfigureServices(IServiceCollection services) 
    { 
     ... 
     services.AddEntityFramework() 
      .AddDbContext<ApplicationDbContext>(options => 
       options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"])); 
     services.AddIdentity<ApplicationUser, IdentityRole>() 
      .AddEntityFrameworkStores<ApplicationDbContext>() 
      .AddDefaultTokenProviders(); 
    } 

这里是路线i ñRolesController.cs我用它来在数据库中创建一个新的角色:

[HttpPost] 
    public IActionResult Create(string rolename) 
    { 
      _db.Roles.Add(new IdentityRole() 
      { 
       Name = rolename 
      }); 
      _db.SaveChanges(); 
      ViewBag.ResultMessage = "Role created successfully!"; 
      return RedirectToAction("Index"); 
    } 

回答

10

我不能发表评论问你,所以,你不说错误用户管理不存在,或角色不存在?我试图复制你的代码,如果用户不存在,你会得到一个“用户不能为空”的错误。但是,如果角色不存在,则会得到“角色[角色]不存在”错误。

我认为你已经添加到你的数据库中的角色?下面是一些代码我在种子的方法使用,基本上你想要做什么,减去使用的意见,做到这一点:

 // Add the Admin role to the database 
     IdentityResult roleResult; 
     bool adminRoleExists = await _roleManager.RoleExistsAsync("Admin"); 
     if (!adminRoleExists) 
     { 
      _logger.LogInformation("Adding Admin role"); 
      roleResult = await _roleManager.CreateAsync(new IdentityRole("Admin")); 
     } 

     // Select the user, and then add the admin role to the user 
     ApplicationUser user = await _userManager.FindByNameAsync("sysadmin"); 
     if (!await _userManager.IsInRoleAsync(user, "Admin")) 
     { 
      _logger.LogInformation("Adding sysadmin to Admin role"); 
      var userResult = await _userManager.AddToRoleAsync(user, "Admin"); 
     } 

编辑

你现在要添加角色的方式离开角色表中的NormalizedName字段为空,我相信这个字段被框架用于向用户添加角色。请尝试以下方法之一,一个角色添加到数据库中,而不是你目前在做什么:

var result = await _roleManager.CreateAsync(new IdentityRole(rolename)); 

或者这也可以工作(虽然没有测试这一项):

[HttpPost] 
public IActionResult Create(string rolename) 
{ 
     _db.Roles.Add(new IdentityRole() 
     { 
      Name = rolename, 
      NormalizedName = rolename.ToUpper() 
     }); 
     _db.SaveChanges(); 
     ViewBag.ResultMessage = "Role created successfully!"; 
     return RedirectToAction("Index"); 
} 
+0

谢谢抓住那个!错误说“角色[角色]不存在”。我编辑了我的问题。我已经将该角色添加到了我的数据库中(下拉列表中填充了“角色”表中的数据)。您的答案中包含的代码是否适合您? – jmk22

+0

是的,这是我用来创建一个新的/空的数据库的实际代码,但基础应该是相同的。你能发布填充你的选择列表的代码吗?你如何将角色添加到数据库中? – FranksBrain

+0

这很有趣。我在上面的编辑中添加了代码。我使用数据库的“Add”方法在控制器的“Create”操作中将角色添加到数据库中。 – jmk22