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

      } 
      } 

А потом в личку консоли я запустить обновление базы данных, , и он успешно посеял базу данных, а в таблице AspNetUserRoles я вижу, что пользователь someUserName и роль администратора связаны.

Но когда я ставлю атрибут [Authorize(Roles = "Administrator")] выше контроллера я был перенаправлен войти в странице, как если бы мой пользователь не был в этой роли, поэтому я добавил строку в моем контроллере:

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

И x - false. Почему это происходит ? И как я могу это исправить? И если это не правильный способ для загрузки базы данных?

ответ

7

Try в методе семян

context.Configuration.LazyLoadingEnabled = true; 

Вот моя догадка, что происходит, когда ленивая загрузка отключена, Роли свойство объекта IdentityUser/ApplicationUser является нулевым или пустым, когда UserManager или UserStore обращается к нему потому что эта коллекция не была загружена вручную. Затем код выполняется так же, как ни один из ролей не был назначен пользователю, когда на самом деле коллекция просто не загружалась.

0

Попробуйте

context.SaveChanges(); 

в конце метода Seed.

Смежные вопросы