Включая данные из ассоциативной таблицы - PullRequest
0 голосов
/ 09 февраля 2019

Я хотел бы спросить, как включить данные в моем случае.Я создал ассоциативную таблицу, в которой я определяю отношения между 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();
 }

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

1 Ответ

0 голосов
/ 09 февраля 2019

Вы забыли упомянуть 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);

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

...