【问题标题】:ASP.NET Core only returning first value of a collection in an entityASP.NET Core 仅返回实体中集合的第一个值
【发布时间】:2016-11-06 21:30:06
【问题描述】:

我有一个 MyEntity 类,里面有一个集合:

public class MyEntity
{    
    [Key]
    public int MyId { get; set; }
    [Display(Name = "Process Name")]
    public string ProcessName { get; set; }
    public ICollection<Step> ProcessSteps { get; set; }
}

与类 Step 的一对多关系:

public class Step
{
    ...
    [ForeignKey("MyEntityForeignKey")]
    public MyEntity { get; set; }
}

以下是返回指定 MyEntity 的 API 调用:

public async Task<IActionResult> MyEntity(int? id)
{
    if (id == null)
    {
        return Ok(await _context.MyEntity.ToListAsync());
    }

    var process = _context.MyEntity.Where(f => f.MyId == id).Include(g => g.ProcessSteps);

    if (process.Count() == 0)
    {
        return NotFound();
    }

    return Ok(process.First());
}

运行它时,除了集合之外,一切看起来都很棒。调试时,会显示正确的值。即使我在这些集合中有 2 个以上的项目,当它返回响应 Ok 时,它总是只返回来自 MyClass 的 ProcessSteps 集合中的第一个项目。

编辑:

看起来返回带有我的外键的响应是罪魁祸首。遍历外键并清空外键似乎已经解决了问题。

foreach (Step step in MyEntity.ProcessSteps)
{
     Step.MyEntity = null;
}

return Ok(MyEntity.ProcessSteps)

【问题讨论】:

  • 如果您在var process 之后放置一个断点并检查内存中的对象,是否会在ProcessSteps 下显示多个项目?
  • 不一定相关,但您应该使用FirstOrDefault() 并检查null,而不是先运行Count(),然后再运行First()。后者将运行两个查询。
  • @NateBarbettini process 只是一个尚未执行的可查询对象,因此不会从数据库中加载任何内容。
  • 您能否展示您的数据库上下文配置以查看从MyEntityStep 的映射是如何配置的?
  • @NateBarbettini 它在调试时确实显示了多个项目。它仅在 JSON 输出中返回 ProcessSteps 的单个值。

标签: entity-framework asp.net-core entity-framework-core


【解决方案1】:

我遇到了类似的问题,除非我将所有内部引用设置为空,否则只返回目标集合的第一个实体。
但是,我可以通过将模型映射到 dto 对象(或ViewModel) 在返回之前。 dto 通常具有模型实体的子集。通过这种方式,我不必将内部引用设置为空。

总的来说,我认为只将严格需要的属性返回给客户端而不给出整个模型对象是一个很好的做法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多