【问题标题】:Model Binding in Web API for .NET Core Type Mismatch.NET Core 类型不匹配的 Web API 中的模型绑定
【发布时间】:2019-07-17 21:37:00
【问题描述】:

我有以下控制器,它应该在数据库中创建一个新对象:

[HttpPost]
public ActionResult<Panels> CreateNewPanel(Panels panel)
{

    _context.Panels.Add(panel);
    _context.SaveChanges();

    return CreatedAtAction(nameof(GetPanelById), new { id = panel.ID }, panel);
}

它正在接收一些JSON数据,例如:

 {
        "desc": "test5",
        "frame": 2,
        "aC240v": false
    }

映射到以下模型:

public class Panels
    {
        public int ID { get; set; }
        public string Desc { get; set; }

        public PanelFrames Frame { get; set; }

        public bool AC240v { get; set; }

    }

如果没有设置“frame”,它在大多数情况下都可以工作,但如果它设置为像上面的代码一样的整数,它会失败,因为它是 PanelFrames 类型而不是整数。

PanelFrames 是另一种与 Panels 具有一对多关系的模型,每个 Panel 只能有一个 PanelFrame,因此在数据库中它被记录为简单的整数,即 PanelFrames ID。

如何协调这一点,以便整数(即 PanelFrame ID)通过 API 传递并记录在数据库中。 MS 文档似乎没有涵盖这一点,尽管这似乎很常见,所以我一定没有理解某些东西,或者做错了什么。

【问题讨论】:

  • 将 DAO 用作请求模型是一种不好的方法。使用 DTO 并将其映射到您的模型
  • 如果框架是另一个对象,你需要"frame" : { "Id": 2 }。这可能会导致问题。

标签: asp.net-core asp.net-web-api


【解决方案1】:

如果您使用EF Core one-to-many relationships 并保存主体实体(PanelFrames) id,您只需在您的Panel 模型中为您的导航属性添加一个外键。参考我下面的演示:

1.模型

public class Panels
{
    [Key]
    public int ID { get; set; }
    public string Desc { get; set; }

    public int FrameID { get; set; }

    [ForeignKey("FrameID")]
    public PanelFrames Frame { get; set; }

    public bool AC240v { get; set; }

}

public class PanelFrames
{
    [Key]
    public int PanelFramesID { get; set; }
    public string Name { get; set; }

    public List<Panels> Panels { get; set; }
}

2.在我的例子中,我使用邮递员传递json数据,所以我需要在动作参数上使用[FromBody]

json:

 {
    "desc": "test5",
    "frameid": 2,
    "aC240v": false
}

行动:

[HttpPost]
public ActionResult<Panels> CreateNewPanel([FromBody]Panels panel)

然后一个带有 FrameId 的新面板将被添加到数据库中。

3.如果您需要获取带有框架的面板,只需使用Include 方法即可

using Microsoft.EntityFrameworkCore;//Add necessary namespaces before
//...
var panels= _context.Panels
    .Include(p => p.Frame)
    .ToList();

【讨论】:

    猜你喜欢
    • 2021-06-30
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2021-03-13
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多