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

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

03.02.2018, 17:03. Показов 1132. Ответов 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
1311 / 889 / 200
Регистрация: 09.09.2011
Сообщений: 2,636
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru