2016-11-14 2 views
2

Я немного искал эту проблему и столкнулся с несколькими вопросами в отношении AspNetUserRoles, которые не были в дизайнере EDMX при генерации из базы данных. Однако его в ModelBrowser и я не могу заставить эту таблицу отображаться, поэтому я могу использовать Roles Authorization.AspNetUserRoles не в EDMX при генерации из базы данных

Когда я ударил этот метод в моем классе Роли

public override string[] GetRolesForUser(string username) 
    { 
     DTE = new DatabaseTestingEntities(); 
     string userID = DTE.AspNetUsers.Where(w => w.Email == username).Select(s => s.Id).FirstOrDefault(); 
     string roleID = DTE.AspNetUsers.Include("AspNetRoles").Where(s => s.Id == userID).FirstOrDefault().ToString();//.AspNetUserRoles.Where(w => w.UserId == userID).Select(s => s.RoleId).FirstOrDefault(); 
     string roleName = DTE.AspNetRoles.Where(w => w.Id == roleID).Select(s => s.Name).FirstOrDefault(); 
     string[] results = { roleName }; 
     return results; 
    } 

Результаты всегда возвращаются в нуле ..

Однако это должно выглядеть следующим образом вместо

public override string[] GetRolesForUser(string username) 
    { 
     DTE = new DatabaseTestingEntities(); 
     string userID = DTE.AspNetUsers.Where(w => w.Email == username).Select(s => s.Id).FirstOrDefault(); 
     string roleID = DTE.AspNetUserRoles.Where(w => w.UserId == userID).Select(s => s.RoleId).FirstOrDefault(); 
     string roleName = DTE.AspNetRoles.Where(w => w.Id == roleID).Select(s => s.Name).FirstOrDefault(); 
     string[] results = { roleName }; 
     return results; 
    } 

Но таким образом выдает ошибку, потому что AspNetUserRoles не находится в дизайнере EDMX, когда я генерирую EF из базы данных.

Как я могу получить эту таблицу, чтобы я мог продолжить, что мне нужно сделать?

Я пробовал обновлять EDMX, и это тоже не работает.

ответ

1

У меня только этот вопрос был более или менее ... «Где таблица AspNetUserRoles в модели?»

Я понимаю, что таблица AspNetUserRoles создана и состоит из двух внешних ключей: одна для таблицы AspNetUsers для ее значения Id и одна для таблицы AspNetRoles, а также для ее значения Id. Когда вы назначаете роль пользователю, он добавляет строку в таблицу AspNetUserRoles, чтобы дать вам так называемое «свойство навигации» в таблице AspNetUsers. Посмотрите на свой edmx и найдите таблицу AspNetUsers, внизу вы увидите свойство навигации «AspNetRoles», и эта коллекция доступна вам в коде объекта AspNetUser.

Как пользователь может принадлежать нескольким ролям, это навигацию коллекция, которая может быть назначена на список что-то вроде этого:

AspNetUser selectedUser = dbContext.AspNetUsers.FirstOrDefault(u => u.UserName == "foo"); 

if (selectedUser == null) return; 

List<AspNetRole> selectedUsersRoles = selectedUser.AspNetRoles.ToList(); 

Для оригинального плаката-х я бы вернуть список и работать с этим ...

public override List<AspNetRoles> GetRolesForUser(string username) 
{ 
    DTE = new DatabaseTestEntities(); 
    AspNetUser selectedUser = DTE.AspNetUsers.FirstOrDefault(u => u.UserName == username); 
    if (selectedUser == null) return null; //User not found - return null 

    return List<AspNetRole> selectedUsersRoles = selectedUser.AspNetRoles.ToList(); 
} 

Это в основном означает, что вы не нуждаетесь в таблице AspNetUserRoles явно. Вы должны иметь возможность работать с ролями пользователя, как указано выше. Я не уверен, рекомендуется ли это или нет, но я бы не стал напрямую вставлять в таблицу AspNetUserRoles. Вы должны просто добавить роль к объекту пользователя и автоматически обновить таблицу UserRoles.

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