Dotnet Core Web API возвращает пустой список |Ленивая загрузка не работает - PullRequest
0 голосов
/ 08 октября 2018

У меня есть конечная точка в моем API, которая возвращает все данные выбранного элемента.Элемент является корневым объектом с именем Survey и имеет список страниц.

public partial class Surveys
{
    public Surveys()
    {
        Pages = new HashSet<Pages>();
    }

    public string Description { get; set; }
    public string Name { get; set; }
    public long Syear { get; set; }
    public long Quarter { get; set; }
    public ICollection<Pages> Pages { get; set; }
}

Класс модели для Pages выглядит следующим образом.

public partial class Pages
{
    public Pages()
    {
        Elements = new HashSet<Elements>();
    }

    public string Id { get; set; }
    public long Number { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int? PageFlowId { get; set; }
    public bool NamedPage { get; set; }
    public bool? IsFirst { get; set; }
    public bool? IsLast { get; set; }
    public long? SurveyQuarter { get; set; }
    public long? SurveySyear { get; set; }

    public PagesFlows PageFlow { get; set; }
    public Surveys Survey { get; set; }
    public ICollection<Elements> Elements { get; set; }
}

Но когда яотправить запрос GET возвращает пустой список для Pages

[
    {
        "description": "Customer Satisfaction Survey",
        "name": "Customer Survey",
        "syear": 2019,
        "quarter": 1,
        "pages": []
    }
]

База данных содержит данные.Первичным ключом таблицы является составной ключ (Syear, Quarter).Мой API выглядит следующим образом.

public async Task<IActionResult> GetSurveys([FromRoute]long syear, long quarter)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        var surveys = await _context.Surveys.Include(s => s.Pages).SingleOrDefaultAsync(s => s.Syear == syear && s.Quarter == quarter);
        if (surveys == null)
        {
            return NotFound();
        }

        return Ok(surveys);
    }

Я пытался выяснить это уже неделю.Любая помощь будет высоко оценена, спасибо заранее.

1 Ответ

0 голосов
/ 22 октября 2018

Мне удалось обойти проблему, выполнив следующее.Удалено .Include(s => s.Pages) отсюда,

var surveys = await _context.Surveys.Include(s => s.Pages).SingleOrDefaultAsync(s => s.Syear == syear && s.Quarter == quarter);

Я добавил ключевое слово virtual ко всем ссылочным классам.

public partial class Pages
{
    public Pages()
    {
        Elements = new HashSet<Elements>();
    }

    public string Id { get; set; }
    public long Number { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int? PageFlowId { get; set; }
    public bool NamedPage { get; set; }
    public bool? IsFirst { get; set; }
    public bool? IsLast { get; set; }
    public long? SurveyQuarter { get; set; }
    public long? SurveySyear { get; set; }

    public virtual PagesFlows PageFlow { get; set; }
    public virtual Surveys Survey { get; set; }
    public virtual ICollection<Elements> Elements { get; set; }
} 

Затем я установил Microsoft.EntityFrameworkCore.Proxies пакет из NuGet, как описано здесь

И включен режим отложенной загрузки прокси в методе Sturtup.cs в ConfigureServices.

services.AddDbContext<MyDBContext>
                (options => options.UseLazyLoadingProxies().UseSqlServer(connection));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...