Lazy Load не работает, даже я заставляю .include - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь получить основную таблицу с 3 массивами значений, и она не работает вообще.Я понятия не имею, как я могу это исправить, я использую по умолчанию получить на контроллере:

public IEnumerable<SelfAssessment> GetSelfAssessment()
    {
        return _context.SelfAssessment;
    }

что я пытаюсь получить по запросу:

    {
        "userEmail": "user@email.com",
        "createdAt": "2018-12-10T08:02:16.117",
        "update": false,
        "discomfort": [
        {
          "bodyPartId": 1,
          "intensityId": 1,
          "frequencyId": 1
        }
      ],
      "saanswers": [
        {
          "answerId": 1
        }
      ], 
      "sapostures": [
        {
          "postureAnswerId": 1,
          "postureId": 1,
        }
      ]
    }

И я получаюэто Json, но с пустыми массивами, как показано ниже:

   {
      "userEmail": "user@mail.com",
      "createdAt": "2018-12-10T08:02:16.117",
      "update": false,
      "discomfort": [],
      "saanswers": [],
      "sapostures": []
   }

Это мой контроллер ниже:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using ErgoSAFE_API.Models;

namespace ErgoSAFE_API.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class SelfAssessmentsController : ControllerBase
{
    private readonly ErgoSAFEContext _context;

    public SelfAssessmentsController(ErgoSAFEContext context)
    {
        _context = context;
    }

    // GET: api/SelfAssessments
    [HttpGet]
    public IEnumerable<SelfAssessment> GetSelfAssessment()
    {
        return _context.SelfAssessment;
    }

    // GET: api/SelfAssessments/5
    [HttpGet("{id}")]
    public async Task<IActionResult> GetSelfAssessment([FromRoute] int id)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var selfAssessment = await _context.SelfAssessment.FindAsync(id);

        if (selfAssessment == null)
        {
            return NotFound();
        }

        return Ok(selfAssessment);
    }

    // PUT: api/SelfAssessments/5
    [HttpPut("{id}")]
    public async Task<IActionResult> PutSelfAssessment([FromRoute] int id, [FromBody] SelfAssessment selfAssessment)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != selfAssessment.SelfAssessmentId)
        {
            return BadRequest();
        }

        _context.Entry(selfAssessment).State = EntityState.Modified;

        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!SelfAssessmentExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return NoContent();
    }

    // POST: api/SelfAssessments
    [HttpPost]
    public async Task<IActionResult> PostSelfAssessment([FromBody] SelfAssessment selfAssessment)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        _context.SelfAssessment.Add(selfAssessment);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetSelfAssessment", new { id = selfAssessment.SelfAssessmentId }, selfAssessment);
    }

    // DELETE: api/SelfAssessments/5
    [HttpDelete("{id}")]
    public async Task<IActionResult> DeleteSelfAssessment([FromRoute] int id)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var selfAssessment = await _context.SelfAssessment.FindAsync(id);
        if (selfAssessment == null)
        {
            return NotFound();
        }

        _context.SelfAssessment.Remove(selfAssessment);
        await _context.SaveChangesAsync();

        return Ok(selfAssessment);
    }

    private bool SelfAssessmentExists(int id)
    {
        return _context.SelfAssessment.Any(e => e.SelfAssessmentId == id);
    }
}
}

.net core 2.1.403

Использование VSCode, а не VisualStudio

Редактировать 1:

        public IEnumerable<Object> Find (int id) {
        IQueryable<object> entryPoint = (from sa in _context.SelfAssessments
                          join a in _context.Answers on sa.SelfAssessmentId equals a.SelfAssessmentId
                          join q in _context.Questions on a.QuestionId equals q.QuestionId
                          where sa.SelfAssessmentId == id
                          select new {
                              SelfAssessmentID = sa.SelfAssessmentId,
                              Yearly = sa.Yearly,
                              Moved = sa.Moved,
                              CreatedAt = sa.CreatedAt,
                              Question = q.Description,
                              Value = a.Value
                          }).Take(10);
        List<object> result = entryPoint.ToList();

        return result;
    }

Редактировать 2:

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

Контроллер:

[HttpGet]
    public IEnumerable<SelfAssessment> GetSelfAssessment()
    {
        var qry = from s in _context.SelfAssessment
                  select s;

        var results = qry.Include("Discomfort").ToList();
        results = qry.Include("Sapostures").ToList();
        results = qry.Include("Saanswers").ToList();

        return results;
    }

Результаты Swagger:

Код
Недокументированное

Подробности Ошибка: ОК

Ответы

Код
200

Описание Успех

1 Ответ

0 голосов
/ 11 декабря 2018

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

Если ваша модель:

    public class MainEntity
    {
        public int Id { get; set; }
        ICollection<MiddleEntity> MiddleEntities { get; set; }
        //Other properties...
    }

    public class MiddleEntity
    {
        public int Id { get; set; }

        public int MainEntityId { get; set; }
        public MainEntity MainEntity { get; set; }

        ICollection<InnerEntity> InnerEntities { get; set; }
        //Other properties...
    }

    public class InnerEntity
    {
        public int Id { get; set; }

        public int MiddleEntityId { get; set; }
        public MiddleEntity MiddleEntity { get; set; }
        //Other properties...
    }

Решение должно быть:

    [HttpGet("{Id}")]
    public ActionResult<IEnumerable<MainEntity>> GetMainEntities(int Id)
    {
        var result = _context.MainEtities
            .Include(x => x.MiddleEntities)
                .ThenInclude(y => y.InnerEntities)
            .ToList();

        return Ok(result);
    }
...