2016-06-02 5 views
0

Я реализовал ASP.Net идентичность с некоторыми пользовательскими свойствами после этой статьи -ASP.Net идентичности, пользователи в роли всегда пусты

http://typecastexception.com/post/2014/06/22/ASPNET-Identity-20-Customizing-Users-and-Roles.aspx

Все работает хорошо, за исключением того. Я хочу, чтобы пользователи находились под определенной ролью (например, «Получите меня всех пользователей в роли администратора»).

Я попытался следующие способы извлечения пользователей -

  var userRole = _roleManager.Roles.SingleOrDefault(m => m.Name == role.Name); 
      var usersInRole = _userManager.Users.Where(m => m.Roles.Any(r => r.RoleId == userRole.Id)); 
      var usersInRole2 = _userService.GetUsers().Where(u => u.Roles.Any(r => r.RoleId == userRole.Id)); 

Где _roleManager имеет тип ApplicationRoleManager : RoleManager<ApplicationRole>. _userManager имеет тип ApplicationUserManager : UserManager<ApplicationUser, string>.

Я не могу получить роли под пользователя в _userManager и _userService

PS: _userService это сервис, который расширяет IRepository который запрашивает DbSet<ApplicationUser>.

Я вижу, что Роли правильно отображаются в таблице ApplicationUserRoles, и я получаю ожидаемый результат, когда я делаю _userManager.IsInRole(user.Id, "Admin");.

Что могло быть не так с этим?

Rahul.

ответ

0

я понял, где этот вопрос -

Первоначально таблица ApplicationUserRoles имели только первичные ключевые определения, а не внешнего ключа отображения (многие ко многим отображения) ..

Я добавил это в OnModelCreating

modelBuilder.Entity<ApplicationUserRole>().HasKey((ApplicationUserRole r) => new { UserId = r.UserId, RoleId = r.RoleId }); 

//added these definitions 
modelBuilder.Entity<ApplicationUser>().HasMany(p => p.Roles).WithRequired().HasForeignKey(p => p.UserId); 
modelBuilder.Entity<ApplicationRole>().HasMany(p => p.Users).WithRequired().HasForeignKey(p => p.RoleId); 

Это завершило отношения, и теперь я вижу Users под номером Roles и наоборот.

В результате проблема при обновлении базы данных, но я просто должен был сделать некоторые изменения в миграции -

Объект «PK_Dbo.ApplicationUserRole» зависит от столбца «UserId». ALTER TABLE DROP COLUMN UserId не удалось, так как один или несколько объектов обращаются к этому столбцу.

Все я есть, я пошел в файл переноса и переехал эти строки выше DropColumn

DropIndex("dbo.ApplicationUserRole", new[] { "ApplicationUser_Id" }); 
DropIndex("dbo.ApplicationUserRole", new[] { "ApplicationRole_Id" }); 
DropPrimaryKey("dbo.ApplicationUserRole"); 

Это решала update-database исключения, а также.

Rahul

3

Если вы используете Entity Framework, это звучит так, будто вы пойманы ленивой загрузкой (поскольку роли добавляются в базу данных, но не по запросу запроса).

Попробуйте что-то вроде следующего:

_userManager.Users.Include(x => x.Roles).Where(m => m.Roles.Any(r => r.RoleId == userRole.Id)); 
Смежные вопросы