2013-12-09 105 views
5

遷移中配置類,還有種方法,它看起來像: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"); 
       }  

      } 
      } 

然後在下午控制檯我已經運行更新數據庫,並且它成功播種了數據庫,並且在表AspNetUserRoles中,我可以看到用戶someUserName和Administrator角色已連接。

但是當我把屬性[Authorize(Roles = "Administrator")]上述控制器我被重定向到登錄頁面,就好像我的用戶在那個角色是不是,所以我在我的控制器中加入一行:

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

而且x是錯誤的。這是爲什麼發生?我該如何解決它?如果這不是種子數據庫的正確方法,那是什麼?

回答

7

嘗試在種子法

context.Configuration.LazyLoadingEnabled = true; 

這是我在什麼時候延遲加載禁用要去猜測,該IdentityUser/ApplicationUser對象的角色屬性爲null或空當的UserManager或UserStore訪問它因爲該集合沒有被手動加載。然後代碼繼續進行,就像沒有角色已經分配給用戶,事實上該集合從未加載過。

0

嘗試

context.SaveChanges(); 

在種子方法的結束。