Контроллер не смог найти данные в списке ASP.NET Core

Алексей спросил: 28 марта 2018 в 04:30 в: c#

У меня проблема с проблемой "индекс вне диапазона". В моем приложении у меня сложная база данных с такими моделями:

И там у меня есть таблицы, созданные для них:

CREATE TABLE [dbo].[Answers] (
[Id]         INT            IDENTITY (1, 1) NOT NULL,
[IsCorrect]  BIT            NOT NULL,
[QuestionId] INT            NULL,
[Text]       NVARCHAR (MAX) NULL,
CONSTRAINT [PK_Answers] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_Answers_Questions_QuestionId] FOREIGN KEY ([QuestionId]) REFERENCES [dbo].[Questions] ([Id]));CREATE TABLE [dbo].[Questions] (
[Id]       INT            IDENTITY (1, 1) NOT NULL,
[LessonId] INT            NULL,
[Text]     NVARCHAR (MAX) NULL,
CONSTRAINT [PK_Questions] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_Questions_Lessons_LessonId] FOREIGN KEY ([LessonId]) REFERENCES [dbo].[Lessons] ([Id]));CREATE TABLE [dbo].[Lessons] (
[Id]         INT            IDENTITY (1, 1) NOT NULL,
[Name]       NVARCHAR (MAX) NULL,
[XpRequired] INT            NOT NULL,
CONSTRAINT [PK_Lessons] PRIMARY KEY CLUSTERED ([Id] ASC));

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

public IActionResult Lesson(int id)
    {
        Lesson lesson = _context.Lessons.FirstOrDefault(l => l.Id == id);
        ViewBag.Questions = lesson.Questions.ToList();
        return View(lesson);
    }

И затем в представлении I ' m пытается взять первый элемент из списка:

@using Easy_English.Models
@model Lesson@{
    ViewData["Title"] = "Test";
    Layout = "~/Views/Shared/_LessonLayout.cshtml";
    List<Question> questions = ViewBag.Questions;
}<div class="wrapper">
    <p>@Model.Name</p>
    <p>@questions[0].Text</p>
</div>

Но я получаю "ArgumentOutOfRangeException: индекс был вне диапазона. Должен быть неотрицательным и меньше, чем размер коллекция. Имя параметра: index"error.

Как вы можете видеть, у меня есть один вопрос для этого урока, и контроллер не смог его найти.

UPD: Contoller находит необходимый урок и все его поля, кроме вопросов.

UPD2: Когда я пишу это, все находит хорошо:

List<Question> questions = _context.Questions.Where(q => q.LessonId == 1).ToList();

1 ответ

Есть решение
Kazbek ответил: 28 марта 2018 в 07:26

Попробуйте написать это и проверьте вывод.

<div class="wrapper">
<p>@Model.Name</p>
<p>@Model.Id</p>
@foreach(Question q in ViewBag.Questions)
{
    <p>@q.Text</p>
}
</div>

UPD: EF Core пока не поддерживает отложенную загрузку. Вам нужно указать соответствующие данные для загрузки.

Lesson lesson = _context.Lessons.Include(t=>t.Questions).FirstOrDefault(l => l.Id == id);

Алексей ответил: 28 марта 2018 в 07:02
Спасибо за ваш ответ. Как я уже сказал в столбце UPD, переменная "урок" в контроллере не имеет вопросов в списке "Вопросы". Может быть, это происходит из-за неправильных ссылок в таблицах? Таблица вопросов находится на последней картинке.
Алексей ответил: 28 марта 2018 в 07:10
С кодом, который вы даете, у меня есть все поля с данными урока, кроме < p > где я показываю текст вопроса.
Kazbek ответил: 28 марта 2018 в 07:20
Также после прочтения комментария Кирка Ларкина я помню, что EF Core не поддерживает Lazy Loading. Запишите это в свой контроллер: Lesson lesson = _context.Lessons.Include(t=>t.Questions).FirstOrDefault(l => l.Id == id);
Алексей ответил: 28 марта 2018 в 07:25
Да, это работает отлично! Большое спасибо вам и @Kirk Larkin. Не могли бы вы обновить свой ответ с новой информацией?