我在如何以数据库为先的方法中寻找如何避免包括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
。我该怎么做?
如果您想read-only
实体,请使用AsNoTracking
。
AsNoTracking()扩展方法返回一个新查询,并且上下文(DbContext或Object Context)不会缓存返回的实体。
[HttpGet]
public async Task<ActionResult<IEnumerable<ProjectPhase>>> GetPhases()
{
return await _context.ProjectPhases.AsNoTracking().ToListAsync();
}
另外一种通过使用与实体类匹配的DTO类使最终对象更好的方法,并且可能使用automapper
进行映射。