代码之家  ›  专栏  ›  技术社区  ›  Nishan

Dotnet Core Web API返回空列表|延迟加载不起作用

  •  1
  • Nishan  · 技术社区  · 7 年前

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

    [
        {
            "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 回复  |  直到 7 年前
        1
  •  1
  •   Nishan    7 年前

    我做了以下几件事,设法避开了这个问题。 .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包装 here

    并在中启用了延迟加载代理 Sturtup.cs 在里面 ConfigureServices

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