【问题标题】:Dotnet Core Web API returning empty list | Lazy loading do not workDotnet Core Web API 返回空列表 |延迟加载不起作用
【发布时间】:2019-03-12 19:50:45
【问题描述】:

我的 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);
    }

一个星期以来,我一直在努力解决这个问题。任何帮助将不胜感激,在此先感谢您。

【问题讨论】:

  • 您是否尝试过其他方法?比如获取调查,然后根据所选调查的 id 选择页面?在您的 EF 中,我没有看到您如何将这两个实体相互关联。
  • 问题是我的参数没有被解析到 GetSurveys 方法。我通过 [public ICollection Pages { get; 关联两个实体。放; }] 上的调查模型和 [公共调查调查 { get;放; }] 在 Pages 模型中。这还不够吗?
  • 如果Pages 为空,则没有与您指定的syearquarter 匹配的调查相关页面。就那么简单。检查你的数据库,那里的数据不是你想象的那样。
  • @Chris 我检查了数据库,在那里我可以看到数据存在。实际上我是通过这个 API 使用 POST 方法添加这些数据的,数据检索似乎是个问题。
  • 不要试图变得困难,但这并不完全是火箭科学,而且你几乎不可能在 EF Core 中偶然发现一个错误,就像一个带有连接的选择一样基本和简单,特别是因为数以百万计的开发人员在生产中使用它而没有问题。要么它没有使用你认为它正在使用的数据库,要么你认为正确的数据实际上不是,但这是你的数据问题。

标签: c# .net-core entity-framework-core asp.net-core-webapi


【解决方案1】:

我通过执行以下操作设法解决了这个问题。 从这里删除了.Include(s =&gt; 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; }
} 

然后我按照here 的描述从 NuGet 安装了 Microsoft.EntityFrameworkCore.Proxies

并在 Sturtup.cs 中的 ConfigureServices 方法中启用了延迟加载代理。

services.AddDbContext<MyDBContext>
                (options => options.UseLazyLoadingProxies().UseSqlServer(connection));

【讨论】:

    猜你喜欢
    • 2019-03-12
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多