[英]POST method with List<T> object with EF Core 5.0 API
所以我一般是編碼新手,開始使用 .net 核心 5.0。 我正在嘗試使用 Entity Framework Core 開發一個簡單的 API,但在嘗試使用 POST 方法時遇到問題。 我有一個名為 Question 的 class 和另一個名為 Template 的 class,如下所示
public class Question
{
public int Id { get; set; }
public string Answer { get; set; }
public int Weight { get; set; }
}
public class Template
{
public int Id { get; set; }
public List<Question> Questions { get; set; }
}
當我在 API 運行的情況下運行 go 到 Postman 時,我在 POST 方法中輸入以下內容:
{
"questions" : [
{ "answer" : "a", "weight" : 2 },
{ "answer" : "b", "weight" : 2 },
{ "answer" : "c", "weight" : 2 },
{ "answer" : "d", "weight" : 2 },
{ "answer" : "a", "weight" : 1 },
{ "answer" : "b", "weight" : 1 }
]
}
但是當我調用 GET 方法時,我得到的響應是這樣的
[
{
"id": 1,
"questions": null
},
{
"id": 2,
"questions": null
}
]
這是我的 TemplatesController class 中帶有 POST 和 GET 的代碼部分
[Route("api/[controller]")]
[ApiController]
public class TemplatesController : ControllerBase
{
private readonly AlfContext _context;
public TemplatesController(AlfContext context)
{
_context = context;
}
// GET: api/Templates
[HttpGet]
public async Task<ActionResult<IEnumerable<Template>>> GetTemplates()
{
return await _context.Templates.ToListAsync();
}
// GET: api/Templates/5
[HttpGet("{id}")]
public async Task<ActionResult<Template>> GetTemplate(int id)
{
var template = await _context.Templates.FindAsync(id);
if (template == null)
{
return NotFound();
}
return template;
}
// POST: api/Templates
[HttpPost]
public async Task<ActionResult<Template>> PostTemplate(Template template)
{
_context.Templates.Add(template);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetTemplate), new { id = template.Id }, template);
}
private bool TemplateExists(int id)
{
return _context.Templates.Any(e => e.Id == id);
}
}
這是我的 DbContext class
public class AlfContext : DbContext
{
public DbSet<Template> Templates { get; set; }
public AlfContext(DbContextOptions<AlfContext> options)
: base(options)
{
}
}
為什么我在“問題”字段中不斷收到“null”作為響應? 我錯過了什么,或者可能是一個概念?
根據您的問題,以我的經驗,我希望您確保:
在發布時,數據是否正確保存到問題實體中。
如果是這樣,在獲取映射時,請確保您的子實體使用預加載加載。 (如 efcore.include() 加載子實體)
如果不使用任何外部映射器,請注意:確保添加初始化列表的構造函數。
public class Template
{
public int Id { get; set; }
public List<Question> Questions { get; set; }
public Template()
{
Questions = new List<Questions>()
}
}
請嘗試一下,如果您需要我提供的其他信息,請告訴我。
您不是在查詢中詢問相關的Question
實體。
將您的 GET 方法修改為 -
[HttpGet]
public async Task<ActionResult<IEnumerable<Template>>> GetTemplates()
{
return await _context.Templates.Include(p=> p.Questions).ToListAsync();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.