EF Core - 不要在查询中包含导航属性
EF Core - Don't include navigation properties in query
我很难找到有关如何避免以数据库优先方法在 EF Core 中包含导航属性的指南。在 Visual Studio 中使用未修改的脚手架网络 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();
}
return 值如下所示:
...{
"phaseId": 1,
"phaseName": "Pilot",
"projects": []
},...
我希望此请求不在 returned 对象中包含 projects
。我该怎么做?
如果您想 read-only
一个实体,请使用 AsNoTracking
。
The AsNoTracking() extension method returns a new query and the returned entities will not be cached by the context (DbContext or Object Context).
[HttpGet]
public async Task<ActionResult<IEnumerable<ProjectPhase>>> GetPhases()
{
return await _context.ProjectPhases.AsNoTracking().ToListAsync();
}
另一种使最终对象更好的方法是使用与实体 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; }
希望这对其他人有帮助!
我很难找到有关如何避免以数据库优先方法在 EF Core 中包含导航属性的指南。在 Visual Studio 中使用未修改的脚手架网络 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();
}
return 值如下所示:
...{
"phaseId": 1,
"phaseName": "Pilot",
"projects": []
},...
我希望此请求不在 returned 对象中包含 projects
。我该怎么做?
如果您想 read-only
一个实体,请使用 AsNoTracking
。
The AsNoTracking() extension method returns a new query and the returned entities will not be cached by the context (DbContext or Object Context).
[HttpGet]
public async Task<ActionResult<IEnumerable<ProjectPhase>>> GetPhases()
{
return await _context.ProjectPhases.AsNoTracking().ToListAsync();
}
另一种使最终对象更好的方法是使用与实体 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; }
希望这对其他人有帮助!