我在 ASP.net core 中有一个 webapi 项目。我包含了控制器和我想要返回的对象。问题是,这个对象可以有很多子对象,而这些子对象又可以有很多子对象。为了让事情易于管理,我只想返回孩子们的 ID。
我能想到的唯一解决方案是制作一个“中间”对象。该对象可以从数据库对象填充/被填充到数据库对象。但我可以想象,当 API 增长时,这会变得相当麻烦。此外,当添加字段但忘记填充时,它很容易出错。
是否可以制作类似属性的东西来确保只返回子项的 Id?
[ApiController]
[Route("[controller]")]
public class ProjectItemsController : ControllerBase
{
[HttpGet]
[Route("GetById")]
public async Task<ActionResult<MyItem>> GetById(int id)
{
MyItem? item = await _context.FindAsync<MyItem>(id);
if (item == null)
return NotFound();
return Ok(item);
}
}
public class ProjectItem
{
[Key]
public int Id { get; set; }
public string Title { get; set; } = "";
public DateTime Created { get; set; }
public virtual User? CreatedByUser { get; set; }
public virtual ICollection<ProjectItem> Children { get; } = new List<ProjectItem>();
public virtual ProjectItem? Parent { get; set; }
}
编辑:为了避免混淆,我希望以此作为回复
获取ID/1
{
"id": 1,
"title": "string",
"created": "2023-09-20T19:51:04.524Z",
"createdByUser": {
"id": 0,
"keycloakId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"userName": "string",
"email": "string"
},
"children": [
{ "id": 2} ,
{ "id": 3}
],
"parent": { "id": 4}
}
如果这是您的永久功能,您只返回子记录的 ID,请创建相应的模型
public class ProjectItemLimited
{
[Key]
public int Id { get; set; }
public virtual ICollection<ProjectItemLimited> Children { get; set; }
public virtual ProjectItemLimited? Parent { get; set; }
}
对于需要所有数据的路线,使用不同的模型/数据库上下文。
万一我误解了,你真正需要的是 API 数据的有限暴露......在这种情况下,你可以保留数据库上下文的原始模型并创建这个有限的模型,并使用像 AutoMapper 这样的工具来补充你的数据。 JSON 响应的模型。