С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 02.05.2016
Сообщений: 42

Как вытащить столбец из связываемой таблицы?

03.02.2018, 17:03. Показов 1128. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, нужна помощь по Entity Framework.
К примеру у меня в БД есть 3 таблицы:
  1. Таблица "companies" - Список Компаний
  2. Таблица "peoples" - Список сотрудников
  3. Таблица "companyPeoples" - Связываемая таблица.
И т.к. 1 человек может являться сотрудником в разным компаниях, то в связываемой таблице, помимо ID сотрудника и компании, есть ещё столбец с их должностью в этой компании.

Вот сущности этих таблиц:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    class people
    {
        public int id { get; set; }
        [Required]
        [StringLength(100)]
        public string aName { get; set; }
        [StringLength(12)]
        public string aHappyBirstday { get; set; }
 
        public ICollection<company> Companies{ get; set; }
        public people()
        {
            Companies= new List<company>();
        }
    }
    class company
    {
        public int id { get; set; }
        [StringLength(100)]
        public string titleEng { get; set; }
        [Required]
        [StringLength(100)]
        public string titleRu { get; set; }
 
        public ICollection<people> Peoples{ get; set; }
        public company()
        {
            Peoples = new List<people>();
        }
    }
    class UserContext : DbContext
    {
        public UserContext()
            : base("dbConnect")
        { }
 
        public DbSet<people> Peoples { get; set; }          
        public DbSet<company> Companies{ get; set; }           
 
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<people>() 
             .HasMany(p => p.Companies)
             .WithMany(c => c.Peoples )
             .Map(m => { m.ToTable("companyPeoples"); });
        }
    }
Вот как я вывожу данные из БД:
C#
1
2
3
4
5
6
7
8
9
10
11
            using (UserContext db = new UserContext())
            {
 
                foreach (company t in db.Companies.Include(t => t.Peoples ))
                {
                    foreach (people pl in t.Peoples)
                    {
                        MessageBox.Show("Сотдруник: " + pl.aName , "Компания: " + t.titleRu);
                    }
                }
            }
И Вот вопрос, как тут можно получить из связываемой таблицы столбец с должностью сотрудника, чтобы я смог примерно как-то так его применить при выводе:
C#
1
MessageBox.Show("Сотдруник: " + pl.aName + "\n Должность:" + pl.position , "Компания: " + t.titleRu);
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.02.2018, 17:03
Ответы с готовыми решениями:

Получение дополнительного столбца из связываемой таблицы в Entity Framework
Здравствуйте, не могу разобраться как вытащить из связываемой таблицы дополнительный столбец и информацию о сотруднике. Предупреждаю...

Как вытащить ID таблицы?
Подскажите, пожалуйста! Как вытащить id поля и вставить его как номер?

Как вытащить значение из таблицы бд sqlite
Здравствуйте.Помогите пожалуйста разобраться. Суть такая.Есть две таблицы в бд.Нужно вытащить значение из одной таблицы и подставить в...

12
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
03.02.2018, 17:48
Цитата Сообщение от Dea_Winchester Посмотреть сообщение
.Map(m => { m.ToTable("companyPeoples"); });
Вы неправильно сконфигурировали ваше отношение.
EF способна генерить только дефолтные join-таблицы с такой конфигурацией.

Для кастомных join таблиц нужно создавать 2 связи 1-m к join таблице - на каждую сущность из m-n.
Пример здесь.
1
0 / 0 / 0
Регистрация: 02.05.2016
Сообщений: 42
03.02.2018, 18:01  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
Для кастомных join таблиц нужно создавать 2 связи 1-m к join таблице - на каждую сущность из m-n.
Пример здесь.
Я просмотрел этот пример и перешел там по ссылке с другим примером. Но я там не видел как это можно вывести.
К примеру вывести вывести всех сотрудников одной компании с должностями.

Добавлено через 4 минуты
Либо вот как в данном примеру, вытащить всех игроков определенной команды, с ценами и датами
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
03.02.2018, 18:10
Внимательно смотрите на код определения join - таблицы.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Student
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Enrollment> Enrollments { get; set; }//each student can have many enrollments
}
 
public class Course
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Enrollment> Enrollments { get; set; }//each course can have many enrollments
}
 
 
public class Enrollment
{
    public int EnrollmentId { get; set; }
    public int PercentComplete{ get; set; }
    // Вот оно !
    public Course Course { get; set; } //each single enrollment involves one course 
    // И вот
    public Student Student { get; set; } //each single enrollment involves one student
}
То есть в вашем случае будет так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class CompanyEmployee
{
    public int IdEmloyee { get; set; }
    public int IdCompany{ get; set; }
    public string Position { get;set;}
    // Вот оно !
    public Company Company { get; set; } //each single enrollment involves one course 
    // И вот
    public Employee Employee { get; set; } //each single enrollment involves one student
}
 
 
public class Company
{    
    public int CompanyId { get; set; }
    public string Name { get; set; }
    public List<CompanyEmployee> Employees { get; set; }
}
Перебираем:
C#
1
2
3
4
5
6
7
8
9
10
11
// ..
using (var context = new MyContext())
{
  // sample
   var company = context.Companies.Find(1); 
   company.Employees.ToList().ForEach(e => {
   Console.WriteLine(e.Positition);
   Console.WriteLine(e.Employee.SomeProperty); //etc
});
 
}
Добавлено через 2 минуты
Только перебирать нужно либо в пределах контекста (сделав нав. свойства виртуальными), либо c Include-ами (eager loading).
1
0 / 0 / 0
Регистрация: 02.05.2016
Сообщений: 42
03.02.2018, 18:29  [ТС]
Я вот пытаюсь вытащить с помощью Include-ов, но что-то не выходит.
Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
            using (UserContext db = new UserContext())
            {
 
                foreach (company t in db.Companies.Include(t => t.companyPeoples))
                {
                    foreach (companyPeople pl in t.companyPeoples)
                    {
                        MessageBox.Show("Сотрудник: " + pl.People.aName + "\n Должность:" + pl.position , "Компания: " + t.titleRu);
                    }
                }
            }
Ошибок нету, просто ничего не происходит.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
03.02.2018, 19:16
Цитата Сообщение от Dea_Winchester Посмотреть сообщение
Ошибок нету, просто ничего не происходит.
Ничего не выводится? А данные есть в этой таблице?
0
0 / 0 / 0
Регистрация: 02.05.2016
Сообщений: 42
03.02.2018, 19:23  [ТС]
Да, всё есть.
Если попытаться вывести просто id Сотрудника, то все выводит.
Вот так все номер он выводит ID:
C#
1
MessageBox.Show("Сотрудник: " + pl.people_Id + "\n Должность:" + pl.position , "Компания: " + t.titleRu);
Добавлено через 3 минуты
Вот если даже так написать:
C#
1
MessageBox.Show("Сотрудник: " + pl.Company.titleRu + "\n Должность:" + pl.position , "Компания: " + t.titleRu);
то все работает, а вот почему-то с сотрудниками нет
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
03.02.2018, 19:56
Попробуйте подтягивать данные тогда и из join таблицы.
C#
1
2
3
// как-то так, но со строгой типизацией тоже можно, то есть не строками
foreach (company t in db.Companies.Include("companyPeoples.Employee"))
{}
Все же лучше включить ленивую загрузку - код будет чище. Да и загружать будете меньше данных, что важно.

Добавлено через 31 минуту
Dea_Winchester, покажите ваши модели и как вы их отображаете. Если что-то все еще не получается, то тут и задавайте вопросы.
0
0 / 0 / 0
Регистрация: 02.05.2016
Сообщений: 42
03.02.2018, 20:01  [ТС]
Вот:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
    class people
    {
        public int id { get; set; }
        [Required]
        [StringLength(100)]
        public string aName { get; set; }
        [StringLength(12)]
        public string aHappyBirstday { get; set; }
 
        public List<companyPeople> companyPeoples { get; set; }
    }
    class companyPeople
    {
        public int id { get; set; }
        [Required]
        public int people_Id { get; set; }
        [Required]
        public int company_Id { get; set; }
        public int position_Id { get; set; }
 
        public people People{ get; set; }
        public company Company{ get; set; }
    }
    class company
    {
        public int id { get; set; }
        [StringLength(100)]
        public string titleEng { get; set; }
        [Required]
        [StringLength(100)]
        public string titleRu { get; set; }
 
        public List<companyPeople> companyPeoples { get; set; }
    }
    class UserContext : DbContext
    {
        public UserContext()
            : base("dbConnect")
        { }
 
        public DbSet<people> Peoples { get; set; }          
        public DbSet<company> Companies { get; set; }  
        public DbSet<companyPeople> companyPeoples { get; set; }           
 
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<people>()
                .HasMany(p => p.companyPeoples)
                .WithRequired(t => t.People)
                .HasForeignKey(t => t.people_Id);
            modelBuilder.Entity<company>()
                .HasMany(te => te.companyPeoples)
                .WithRequired(tr => tr.Company)
                .HasForeignKey(tr => tr.company_Id);
        }
    }
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
03.02.2018, 20:19
Dea_Winchester, еще раз говорю, потрудитесь включить ленивую загрузку, вот тут есть указания.
Все у вас заработает.

Добавлено через 1 минуту
Вот это:
1. context.Configuration.ProxyCreationEnabl ed should be true.
2. context.Configuration.LazyLoadingEnabled should be true.
3. Navigation property should be defined as public, virtual. Context will NOT do lazy loading if the property is not defined as virtual.
0
0 / 0 / 0
Регистрация: 02.05.2016
Сообщений: 42
03.02.2018, 22:17  [ТС]
Не до конца понимаю, просто прописать вот это?
C#
1
2
3
4
5
        public UserContext() : base("dbConnect")
        {
            this.Configuration.LazyLoadingEnabled = true;
            this.Configuration.ProxyCreationEnabled = true;
        }
Добавлено через 1 час 52 минуты
Я вот попытался отдельно вытащить из связываемой таблицы Информации о сотрудниках, но там ошибка, может этот как-то связано.
вот код:
C#
1
2
3
4
5
                foreach (companyPeople t in db.companyPeoples.Include(t => t.People))
                {
                    foreach (people pl in t.People) // Ошибка тут
                        MessageBox.Show("Сотрудник: " + pl.aName, "Должность: " + t.position_Id);
                }
Сама ошибка:
Ошибка CS1579 Оператор foreach не работает с переменными типа "MainprobaFirst.people", так как "MainprobaFirst.people" не содержит открытого определения для "GetEnumerator".
0
0 / 0 / 0
Регистрация: 02.05.2016
Сообщений: 42
04.02.2018, 22:23  [ТС]
Сможет мне кто-нибудь помочь?
0
HF
 Аватар для HF
1308 / 886 / 200
Регистрация: 09.09.2011
Сообщений: 2,603
Записей в блоге: 2
07.02.2018, 19:55
Общался с ТС в привате, отправил целый "наколенный" проект для примера. Всё работало. Нужно было сделать сразу как я сказал - Навигационные свойства должны быть virtual. Как только это сделал - сразу заработал объект People.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2018, 19:55
Помогаю со студенческими работами здесь

Как вытащить из таблицы только 10 строк?
Здравствуйте! Можно-ли сделать такое: Есть 3 контейнера div, в первый необходимо показать первые 10 строк из таблицы у которых...

Как вытащить записи таблицы в строковую переменную
Имеется таблица в базе данных Access. Как программно из delphi из этой таблицы вытащить все записи какого-нибудь поля в строковую...

Как вытащить данные с таблицы Access в переменные?
суть вопроса такова есть класс в котором 5 премених, создал глобальный екземпляр класа Надо записивать дание с таблици в преремение ...

Как можно вытащить из таблицы названия столбцов
Подскажите , как можно вытащить из таблицы названия столбцов ? Вот например, эта строка вытаскивает только значения этих столбцов ...

Запросы: Как вытащить последние 5 строк из таблицы
Как вытащить последние 5 строк из таблицы? везде работала функция LIMIT, а в ASP.NET не прокатило(( SqlCommand comMenu = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru