繁体   English   中英

EF Core - 不要在查询中包含导航属性

[英]EF Core - Don't include navigation properties in query

我很难找到有关如何避免以数据库优先方法在 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": []
},...

我希望此请求不包括返回的 object 中的projects 。我该怎么做?

如果你想read-only实体使用AsNoTracking

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

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

另一种使最终 object 更好的方法是使用与实体 class 匹配的 DTO class 并可能使用automapper器进行映射。

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

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

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

希望这可以帮助别人!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM