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 обновляться автоматически.

Другие вопросы по тегам