Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
3 / 3 / 0
Регистрация: 15.12.2013
Сообщений: 155
1

Entity Framework. Связь между таблицами один ко многим

08.08.2018, 12:47. Просмотров 1196. Ответов 9
Метки нет (Все метки)

Здравствуйте. Столкнулся с такой проблемой - у меня есть таблицы Тестов и Вопросов (к тестам), связь один ко многим. Реализация следующая (ее часть со связями):

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Test
{
     ….
     public ICollection<Question> Questions { get; set; }
     
     public Test()
        {
            Questions = new List<Question>();
        }
}
 
public class Question
{
     ….
     public int TestId { get; set; }
 
     public Test Test { get; set; }
}
Если это неправильно, то попрошу не бранить, а указать на правильный вариант
Так вот проблема такая - если обращаться к базе данных и вытаскивать из нее тест какой-нибудь, то его поле Questions будет пустым, однако если вытаскивать какой-либо вопрос, то его поле Test не будет пустым, а в нем будет тот тест, к которому относится вопрос. Вопрос - это нормальное поведение или что-то здесь не так?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.08.2018, 12:47
Ответы с готовыми решениями:

Entity Framework 6. Code First. Связь один-ко-многим и многие-ко-многим одновременно
Здрасти. Есть таблица юзеров и объявлений. У юзера может быть множество объявлений. Здесь действует...

Связь 1:1 между несколькими таблицами Entity Framework
Есть недвижимость 3-х типов земельные участки, квартиры и дома хочу внести адресные данные в общую...

Организовать связь один-ко-многим между таблицами
У меня есть три таблицы. Как правильно организовать связь один ко многим между ними? Правильно ли...

Связь многие-ко-многим в Entity Framework
делаю задания с моделями сущностей entity framework. на примере студентов и курсов, у каждого...

9
Эксперт .NET
7280 / 5029 / 860
Регистрация: 21.01.2016
Сообщений: 19,290
08.08.2018, 13:37 2
ship79, фрагменты кода корректные. Как вы вытаскиваете данные?
0
3 / 3 / 0
Регистрация: 15.12.2013
Сообщений: 155
08.08.2018, 13:54  [ТС] 3
Usaga, данные вытаскиваю с помощью LINQ запроса, вот так вот:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Test test;
using (var db = new TestContext())
{
    test = db.Tests.Find(id);
 
    var questions = db.Set<Question>().AsQueryable();
 
    var questionsList = (
         from question in questions
         where question.TestId == id
         orderby question.QuestionId ascending
         select question).ToList();
 
    test.Questions = questionsList;
}
0
Эксперт .NET
7280 / 5029 / 860
Регистрация: 21.01.2016
Сообщений: 19,290
08.08.2018, 14:28 4
ship79, это что за нафиг?)))

Может правильнее вытаскивать данные?

C#
1
2
3
4
using (var db = new TestContext())
{
    test = db.Tests.Include(x => x.Questions).FirstOrDefault(x => x.id == id);
}
0
3 / 3 / 0
Регистрация: 15.12.2013
Сообщений: 155
08.08.2018, 14:42  [ТС] 5
Usaga, ого, как все просто оказывается... а если у меня еще есть аналогичная ситуация с таблицами Questions и Answers, и мне нужно вытащить тест с вопросами, которые в свою очередь должны быть с ответами? Мне просто нужно как то дополнить эту строку кода ? или написать что то вроде этого :
C#
1
2
3
4
5
6
using (var db = new TestContext())
{
    test = db.Tests.FirstOrDefault(x => x.id == id);
    questions = db.Questions.Include(q => q.Answers).Where(q => q.TestId == id).ToList();
    test.Questions = questions;
}
???
0
Эксперт .NET
7280 / 5029 / 860
Регистрация: 21.01.2016
Сообщений: 19,290
08.08.2018, 14:54 6
ship79, смысл остаётся тем же:

C#
1
2
3
4
5
6
7
using (var db = new TestContext())
{
    test = db.Tests
        .Include(x => x.Questions)
        .Include(x => x.Questions.Select(y => y.Answers))
        .FirstOrDefault(x => x.id == id);
}
1
3 / 3 / 0
Регистрация: 15.12.2013
Сообщений: 155
08.08.2018, 15:01  [ТС] 7
Usaga, ясно, спасибо большое, выручили!

Добавлено через 4 минуты
Usaga, нет, все же он так ругается, он выдает ошибку, и говорит, что ICollection<Question> has no definition for Answers.
0
Эксперт .NET
7280 / 5029 / 860
Регистрация: 21.01.2016
Сообщений: 19,290
08.08.2018, 15:10 8
ship79, я поправил код, изначально забыл про Select():

C#
1
x => x.Questions.Select(y => y.Answers)
0
3 / 3 / 0
Регистрация: 15.12.2013
Сообщений: 155
08.08.2018, 15:21  [ТС] 9
Usaga, в общем это тоже не сработало, но было близко к правильному варианту, который у меня сработал. Мне выдало ошибку и отправило на сайт - https://docs.microsoft.com/ru-ru/ef/core/querying/related-data.
В итоге правильным вариантом в моем случае был следующий код:

C#
1
2
3
4
Test test = context.Tests
                 .Include(t => t.Questions)
                     .ThenInclude(q => q.Answers)
                 .First(t => t.TestId == id);
1
Эксперт .NET
7280 / 5029 / 860
Регистрация: 21.01.2016
Сообщений: 19,290
08.08.2018, 16:41 10
ship79, надо было сразу сказать, что у вас не Entity Framework, как сказано в заголовке темы, а Entity Framework Core, ибо это разные ORM. Тогда сразу бы и ответ корректный получили.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2018, 16:41

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Связь многие ко многим (Entity Framework)
Мне нужна связь многие ко многим. Нашел вот тут хороший туториал который объясняет как ее сделать...

Entity Framework связь один-ко-многим
Приветствую! Имеется две модели (со связью один-ко-многим): public class Menu { ...

Определить тип связи между таблицами. Связь много-ко-многим или один-ко-многим?
Какой тип связи между таблица match и hero, match и team? Склоняюсь к варианту много-ко-многим...

Entity framework, связь многие ко многим
Доброго времени суток ! Зарание извиняюсь если поместил тему не в тот раздел. Вопрос такой у...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.