簡體   English   中英

帶有列表的 POST 方法<t> object 與 EF Core 5.0 API</t>

[英]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”作為響應? 我錯過了什么,或者可能是一個概念?

根據您的問題,以我的經驗,我希望您確保:

  1. 在發布時,數據是否正確保存到問題實體中。

  2. 如果是這樣,在獲取映射時,請確保您的子實體使用預加載加載。 (如 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM