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在返回的对象中。我该怎么做呢?

4

2 回答 2

2

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

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

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

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

于 2020-06-11T19:15:41.997 回答
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; }

希望这对其他人有帮助!

于 2020-06-11T20:00:29.797 回答