Как получить данные из таблицы соединений, используя первый подход БД в MVC

У меня есть отношение «многие ко многим» между двумя таблицами, и я хочу получить данные из соединительной таблицы.

Сначала я делюсь источником

Изображение таблиц базы данных:

https://imgur.com/BDvPiQa

Изображение объектов модели EF:

https://imgur.com/mFHPjfN

Изображение ошибки при отладке:

https://imgur.com/lL7DE72

Я использую следующие правила или стратегии

+Первый подход к базе данных

+диаграмма ЭФ

+Пользовательский поставщик ролей

Проблема в том, что когда я пытаюсь получить данные из соединительной таблицы (user_has_role), я получаю SQL-запрос, а не данные.###

SQL-запрос, который я получаю:

SELECT \r\n [Extent1].[user_id] AS [user_id], \r\n [Extent2].[user_role_name] AS [user_role_name]\r\n FROM [dbo].[user_has_role] AS [Extent1]\r\n INNER JOIN [dbo].[user_role] AS [Extent2] ON [Extent1].[user_role_id] = [Extent2].[user_role_id]

Вот код

Класс поставщика ролей является производным от класса RoleProvider

public class AppRolesProvider : RoleProvider

Все методы переопределены, но работают только с

public override string[] GetRolesForUser(string username)
        {
            //get all user data from user table for id based on user email
            var _user = db.users.Where(u => u.user_email == username).FirstOrDefault();

           var _role = (from s in db.users
                         where (
                           from c in s.user_role
                           where s.user_id == _user.user_id
                           select c
                           ).Any()
                         select s).ToString();

            string[] roleName = { _role };   

            if (roleName != null)
            {
                return roleName;
            }
            else
            {
                roleName = null;
                return roleName;
            }
        }

Я хочу фактическое имя роли против пользователя (у одного пользователя много ролей или, может быть, одна)

Обновлено

Обновленный образ БД

и попытаться получить данные из таблицы соединений, но получить этот запрос

"SELECT \r\n [Extent1].[user_id] AS [user_id], \r\n [Extent2].[user_role_name] AS [user_role_name]\r\n FROM [dbo].[user_has_role] AS [Extent1]\r\n INNER JOIN [dbo].[user_role] AS [Extent2] ON [Extent1].[user_role_id] = [Extent2].[user_role_id]\r\n WHERE [Extent1].[user_id] = @p__linq__0"

не данные

Вот мой метод получить роль в массиве строк

public override string[] GetRolesForUser(string username)
    {
        //get all user data from user table for id based on user email
        int _user_id = Convert.ToInt32(db.users.Where(u => u.user_email == username).Select(i => i.user_id).FirstOrDefault());

        // Get role from user_has_role against user id
        var _roles = (from _uhr in db.user_has_role
                      join _r in db.user_role on _uhr.user_role_id equals _r.user_role_id
                      where _uhr.user_id == _user_id
                      select new
                      {
                          _r.user_role_name
                      }).ToString();

        // store selected
        string[] roleName = { _roles };  

        if (roleName != null)
        {
            return roleName;
        }
        else
        {
            roleName = null;
            return roleName;
        }
    }

вывод изображения в режиме отладки

Обновлено

Изображение EDMX

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
640
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Таблица соединений не была включена в Entity Framework, так как у нее не было первичного ключа. вы решаете эту проблему, добавляя первичный ключ в соединительную таблицу, а затем обновляя свой файл Edmx.

После обновления модели вы можете получить данные из вашей соединительной таблицы с помощью простого запроса linq.

Разница между двумя случаями:

1) если ваша соединительная таблица не содержит первичного ключа, EF сгенерирует два класса с отношением «многие ко многим»
2) если ваша соединительная таблица содержит первичный ключ, EF сгенерирует 3 класса с: соединительной таблицей в отношении один ко многим с пользователем и один ко многим с user_role

Обновлять

Попробуйте с этим, пожалуйста:

public override string[] GetRolesForUser(string username)
    {
        //get all user data from user table for id based on user email
        int _user_id = Convert.ToInt32(db.users.Where(u => u.user_email == username).Select(i => i.user_id).FirstOrDefault());

        // Get role from user_has_role against user id
        var _role = db.user_has_role.Where(r => r.user_id == _user_id).Select(r => r.user_role.user_role_name);

        // store selected
        string[] roleName = _role.ToArray();

        if (roleName != null)
        {
            return roleName;
        }
        else
        {
            roleName = null;
            return roleName;
        }
    }

Я знаю это, но если я не хочу добавлять первичный ключ, что я могу сделать для получения данных?

Ramzan 10.04.2019 04:59

@alaaeddin-hfidhi я пытаюсь сделать так, как вы просили меня добавить первичный ключ в соединительную таблицу, но я не получаю вывод, я обновил свой вопрос, пожалуйста, посмотрите на него и помогите мне

Ramzan 10.04.2019 23:34

@alaaeddin-hfidhi я хочу, чтобы имя_роли было в массиве строк

Ramzan 10.04.2019 23:43

Вы можете отправить мне скриншот вашего файла EDMX?

Alaaeddine HFIDHI 11.04.2019 00:27

Ты знаешь решение?

Ramzan 11.04.2019 21:31

это заняло так много времени, я застрял, пожалуйста, помогите мне

Ramzan 11.04.2019 21:53

Я обновил свой ответ!! если это решение все еще не работает, скажите мне, пожалуйста

Alaaeddine HFIDHI 11.04.2019 22:23

большое спасибо за помощь мне. я немного обновил ваше решение и решил мою проблему, спасибо еще раз, братан

Ramzan 11.04.2019 22:38

Для меня Linq с синтаксисом метода лучше, чем linq с синтаксисом запроса, он делает код более чистым.

Alaaeddine HFIDHI 11.04.2019 22:42

да ты прав. еще раз большое спасибо за помощь братан

Ramzan 11.04.2019 22:44

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