.NET核心类型不匹配的Web API中的模型绑定

时间:2019-07-17 21:37:00

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

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

[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; }

    }

如果未设置“框架”,则大部分情况下都可以使用,但是,如上面的代码那样将其设置为整数,则失败,因为它是PanelFrames类型而不是整数。

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

我如何进行协调,以使整数(即PanelFrame ID)通过API传递并记录在数据库中。 MS文档似乎没有涵盖这一点,尽管这似乎很常见,所以我一定不能理解某些事情,或者做一些非常错误的事情。

1 个答案:

答案 0 :(得分:0)

如果您使用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();