Включение данных из ассоциативной таблицы

Я хотел бы спросить, как включить данные в моем случае. Я создал ассоциативную таблицу, в которой определяю отношения между BusinessGlosItems. На следующем шаге я создал модель BusinessGlosItems и включил справочную таблицу через дочерние и родительские отношения.

Наконец, мне нужно отобразить информацию о BusinessGlosItems со всеми связанными с ним данными. Звучит просто, но я не знаю, как это решить. Кто-нибудь может помочь, пожалуйста?

Мои классы домена следующие:

public class BusinessGlosItem
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string BGIName { get; set; }

    [InverseProperty("ChildBGItem")]
    public ICollection<Reference> ChildReferences { get; set; }
    [InverseProperty("ParentBGItem")]
    public ICollection<Reference> ParentReferences { get; set; }
}

public class Reference
{
    public int Id { get; set; }
    [ForeignKey("ChildBGItem")]
    public int? ChildGlosItemId { get; set; }
    [ForeignKey("ParentBGItem")]
    public int? ParentGlosItemId { get; set; }

    public int ReferenceTypeId { get; set; }

    public virtual ReferenceType ReferenceType { get; set; }

    public virtual BusinessGlosItem ChildBGItem { get; set; }

    public virtual BusinessGlosItem ParentBGItem { get; set; }
}

Что я хотел бы сделать:

@page
@model BusinessGlosItem.DetailsModel

<div>
    <table class = "table table-hover">
        <th>Reference Type</th>
        <th>Parent Item Name</th>
        <th>Child Item Name</th>

        @foreach (var item in Model.BusinessGlosItem.ParentReferences)
        {
            <tr>
                <td>@item.ReferenceType.ReferenceTypeName</td>
                <td>@item.ParentBGItem.BGIName</td>
                <td>@item.ChildGlosItemId</td> //Here I would like to see the ChildItem Name
            </tr>
        }
    </table>
</div>

Я получаю NullReferenceException: Object reference not set to an instance of an object. on the line из представления.

Мой метод:

public BusinessGlosItem BusinessGlosItem { get; set; }

public async Task<IActionResult> OnGetAsync(int? id)
{
      if (id == null)
      {
                return NotFound();
      }

      BusinessGlosItem = await _context.businessGlosItem                 
                .Include(x => x.BusinessArea)
                .Include(x => x.BusinessGlosItemStatus)
                .Include(x => x.ChildReferences).ThenInclude(x=>x.ReferenceType)
                .Include(x => x.ParentReferences).ThenInclude(x=>x.ReferenceType)
                .Include(x=>x.businessGlosItemComments)
                .SingleOrDefaultAsync(m => m.Id == id);

      if (BusinessGlosItem == null)
      {
           return NotFound();
      }
      return Page();
 }

Заранее большое спасибо!

Вы пытаетесь показать детали BusinessGlosItem с его ChildReferences и ParentReferences, не так ли? или что-то большее, чем это?

TanvirArjel 09.02.2019 13:16

да, мне нужно увидеть имя как дочернего, так и родительского элемента

xcelm 09.02.2019 13:19

Хорошо! Теперь скажите мне, что не так с вашим существующим кодом?

TanvirArjel 09.02.2019 13:20

когда я выполняю этот код: @foreach (элемент var в Model.BusinessGlosItem.ParentReferences) { <tr> <td>@item.ReferenceType.ReferenceTypeName</td> <td>@item.ParentBGItem.BGIName</td> <td >@item.ChildBGItem.BGIName</td> //Здесь я хотел бы видеть имя ChildItem </tr> } Я получаю эту ошибку: NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в строке <td>@item.ChildBGItem.BGIName</td>

xcelm 09.02.2019 13:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
202
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы забыли упомянуть ThenInclude как для ChildBGItem, так и для ParentBGItem как в ChildReferences, так и в ParentReferences. Таким образом, ваш запрос должен быть следующим:

BusinessGlosItem = await _context.businessGlosItem                 
            .Include(x => x.BusinessArea)
            .Include(x => x.BusinessGlosItemStatus)
            .Include(x => x.ChildReferences)
                .ThenInclude(x=>x.ReferenceType)
            .Include(x => x.ChildReferences) // You missed this include
                .ThenInclude(x=>x.ChildBGItem)
            .Include(x => x.ChildReferences) // You missed this include
                .ThenInclude(x=>x.ParentBGItem)
            .Include(x => x.ParentReferences)
                .ThenInclude(x=>x.ReferenceType)
            .Include(x => x.ParentReferences) // You missed this include
                .ThenInclude(x=>x.ChildBGItem)
            .Include(x => x.ParentReferences) // You missed this include
                .ThenInclude(x=>x.ParentBGItem)
            .Include(x=>x.businessGlosItemComments)
            .SingleOrDefaultAsync(m => m.Id == id);

Теперь это должно работать.

Другие вопросы по теме

Как изменить автоматически сгенерированное имя внешнего ключа «теневые свойства» для всех объектов?
EF Core — как настроить «многие ко многим» для той же сущности, которая уже имеет отношение «один ко многим»
Entity Framework Core создает неправильный снимок модели, хотя у меня есть правильный контекст и модели dbsets
Коллекция в модели структуры объекта не обновляется
Создайте зашифрованную базу данных SQLite с помощью C# EntityFramework и откройте ее с помощью браузера баз данных для SQLite
EF Core создает исключение DbUpdateConcurrencyException при сохранении прикрепленных сущностей
EF: обновление без выбора с условием
Как получить доступ к базе данных SQLite напрямую из DLL (без использования app.config)?
SQL Server 2017 — EF пытается получить доступ к другой базе данных, чем в строке подключения
Как легко ограничить данные только зарегистрированным пользователем в Entity Framework Core Identity