2016-09-15 9 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を選択することを可能にし、という名前は既に私が作成した役割のです。たとえば、私は "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を使用しようとしましたが、失敗しました。

この正確なコードは、アイデンティティ3.0とMVC 6を使ってこのアプリケーションを構築したときに機能しました。アイデンティティ・コアに移行する際に何か変わったようです。

どのような考えですか?

編集

ここで私は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.cs中でアイデンティティを追加する方法ですが、 ConfigureServices方法:

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

ここでは経路i nは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

私がお聞きし、まだコメントを投稿することができませんので、ごエラーがユーザー管理者が存在しないと言うんかロールは存在しませんか?私は私の最後にあなたのコードを複製しようとしましたが、ユーザーが存在しない場合、 "ユーザーはnullにはなれません"というエラーが表示されます。ただし、ロールが存在しない場合は、「ロール[ロール]は存在しません」というエラーが表示されます。

私はあなたのデータベースにすでにロールを追加しているとしますか?ここで私は、基本的に何をしたいん私のシード法で使用される、マイナスにそれを行うためにビューを使用していくつかのコードは次のとおりです。

 // 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"); 
     } 

EDIT

あなたが役割を追加している方法は、今のままRoleテーブルの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

関連する問題