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

时间:2020-06-11 18:58:27

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

我很难找到有关如何以数据库为先的方法避免在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。我该怎么做?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

就我的目的而言,使用Automapper之类的工具有点过头了。我只想排除一些导航属性,因此只使用了JsonIgnore属性。

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

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

希望这对其他人有帮助!