【问题标题】:EF Core - Don't include navigation properties in queryEF Core - 不要在查询中包含导航属性
【发布时间】:2020-06-11 18:58:27
【问题描述】:

我很难找到有关如何以数据库优先的方法避免在 EF Core 中包含导航属性的指导。在 Visual Studio 中使用未修改的脚手架 Web API 控制器,我有一个看起来像这样的实体(例如简化):

public partial class ProjectPhase
{
  public ProjectPhase()
  {
     Projects = new HashSet<Project>();
  }

  public int PhaseId { get; set; }
  public string PhaseName { get; set; }

  public virtual ICollection<Project> Projects { get; set; }
}

我的请求是默认的脚手架 HTTP GET 请求:

// GET: api/Phases
[HttpGet]
public async Task<ActionResult<IEnumerable<ProjectPhase>>> GetPhases ()
{
  return await _context.ProjectPhases.ToListAsync();
}

返回值如下:

...{
  "phaseId": 1,
  "phaseName": "Pilot",
  "projects": []
},...

我希望此请求不在返回的对象中包含 projects。我该怎么做?

【问题讨论】:

  • 我会为该响应创建一个 DTO 并且不包含该属性。这样,您将控制将返回给客户端的内容。
  • 是的,@devcrp 建议更好
  • @devcrp 所以你说的是每个实体,我应该创建一个不包含 projects 属性的 &lt;entity&gt;DTO 类型。然后所有默认请求都需要更改为_context.ProjectPhases.Select(p =&gt; new DTO { PhaseId = p.PhaseId, PhaseName = p.PhaseName }).ToListAsync(),对吗?到目前为止,我已经这样做了,但最终我不得不制作大量的新类型来处理我所有的数据库模型。我一直在寻找捷径。没有更简单的方法吗?编辑:原因是,我所有的 DTO 都只是没有虚拟属性的对象属性......没什么复杂的
  • @TheDoc 也许这有帮助? stackoverflow.com/questions/11320968/…

标签: c# asp.net-core-webapi ef-database-first ef-core-3.1


【解决方案1】:

如果您想read-only 一个实体,请使用AsNoTracking

AsNoTracking() 扩展方法返回一个新查询,返回的实体不会被上下文(DbContext 或 Object Context)缓存。

[HttpGet]
public async Task<ActionResult<IEnumerable<ProjectPhase>>> GetPhases()
{
  return await _context.ProjectPhases.AsNoTracking().ToListAsync();
}

另一种使最终对象更好的方法是使用与实体类匹配的 DTO 类并使用automapper 进行映射。

【讨论】:

  • 没有不好的建议,但请参阅下面的答案以了解对我有用的方法
【解决方案2】:

出于我的目的,使用 Automapper 之类的东西有点矫枉过正。我只是想排除一些导航属性,所以我只是像这样使用了JsonIgnore 属性。

public int PhaseId { get; set; }
public string PhaseName { get; set; }

[System.Text.Json.Serialization.JsonIgnore]
public virtual ICollection<Project> Projects { get; set; }

希望这对其他人有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-23
    • 2018-05-25
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    相关资源
    最近更新 更多