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

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

08.08.2018, 12:47. Просмотров 402. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2018, 12:47
Ответы с готовыми решениями:

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

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

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

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

В чем разница между Entity Framework и Entity Framework Core?
В чем разница (если она есть) между entity framework и entity framework core?

9
Usaga
Эксперт .NET
5706 / 3939 / 702
Регистрация: 21.01.2016
Сообщений: 15,508
Завершенные тесты: 2
08.08.2018, 13:37 2
ship79, фрагменты кода корректные. Как вы вытаскиваете данные?
0
ship79
2 / 2 / 0
Регистрация: 15.12.2013
Сообщений: 151
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
Usaga
Эксперт .NET
5706 / 3939 / 702
Регистрация: 21.01.2016
Сообщений: 15,508
Завершенные тесты: 2
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
08.08.2018, 14:28
ship79
2 / 2 / 0
Регистрация: 15.12.2013
Сообщений: 151
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
Usaga
Эксперт .NET
5706 / 3939 / 702
Регистрация: 21.01.2016
Сообщений: 15,508
Завершенные тесты: 2
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
ship79
2 / 2 / 0
Регистрация: 15.12.2013
Сообщений: 151
08.08.2018, 15:01  [ТС] 7
Usaga, ясно, спасибо большое, выручили!

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

C#
1
x => x.Questions.Select(y => y.Answers)
0
ship79
2 / 2 / 0
Регистрация: 15.12.2013
Сообщений: 151
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);
0
Usaga
Эксперт .NET
5706 / 3939 / 702
Регистрация: 21.01.2016
Сообщений: 15,508
Завершенные тесты: 2
08.08.2018, 16:41 10
ship79, надо было сразу сказать, что у вас не Entity Framework, как сказано в заголовке темы, а Entity Framework Core, ибо это разные ORM. Тогда сразу бы и ответ корректный получили.
0
08.08.2018, 16:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2018, 16:41

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

Entity Framework. Связь 1 к 1
Привет всем Имею два класса: public class EntityA { public Guid Id { get; set; } } ...

Entity Framework - связь через интерфейсы
привет подскажите как можно реализовать interface IPerson class student:IPerson class...


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

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

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