AspNetUserRoles не в EDMX при генерации из базы данных
Я немного обыскал эту проблему и натолкнулся на несколько вопросов, касающихся того, что AspNetUserRoles не участвует в разработке EDMX при генерации из базы данных. Однако он находится в ModelBrowser, и я не могу отобразить эту таблицу, чтобы я мог использовать авторизацию ролей.
Когда я ударил этот метод в моем классе ролей
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 обновляться автоматически.