2013-12-09 6 views
5
移行Configurationクラスで

、そこに種子方法であり、それは次のようになります。ASP.net MVC + ASP.netアイデンティティ播種ロールとユーザー

protected override void Seed(DatabaseContext context) 
     { 
      var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); 
      var userManager = new UserManager<User>(new UserStore<User>(context)); 

      if (!roleManager.RoleExists("Administrator")) 
      { 
       roleManager.Create(new IdentityRole("Administrator")); 
      } 

      var user = new User {UserName = "someUserName"}; 


      if (userManager.FindByName("someUserName") == null) 
      { 
       var result = userManager.Create(user, "password"); 

       if (result.Succeeded) 
       { 
        userManager.AddToRole(user.Id, "Administrator"); 
       }  

      } 
      } 

そしてPMコンソールに私が更新-データベース実行しましたそれは正常にデータベースをシードし、テーブルAspNetUserRolesで私はsomeUserNameと管理者ロールが接続されていることがわかります。

しかし、私は、コントローラ上の属性[Authorize(Roles = "Administrator")]を入れたとき、私は私のユーザーがその役割ではなかったかのようにページにログインするためにリダイレクトされてきたので、私は私のコントローラにラインを追加しました:

var x = _userManager.IsInRole(_userManager.FindByName("someUserName").Id, "Administrator"); 

そして、 xは偽です。なぜこうなった ?それをどうやって修正することができますか?そして、これがデータベースをシードする正しい方法ではない場合、それは何ですか?

答えて

7

てみ

context.Configuration.LazyLoadingEnabled = true; 

はここで遅延ロードが無効になっているときに何が起こっているかで、私の推測だのUserManagerまたはUSERSTOREがそれにアクセスするとき、IdentityUser/ApplicationUserオブジェクトの役割プロパティがnullまたは空ですそのコレクションは手動でロードされていないためです。実際にはコレクションが一度もロードされなかった場合、コードはユーザーに割り当てられていないような役割を果たします。

0

はシード法の終わりに

context.SaveChanges(); 

を試してみてください。あなたのシード方法で

関連する問題