在ASP.NET-MVC实体框架中保存与外键相关的实体(POST / PUT请求)

时间:2018-12-08 17:16:01

标签: c# asp.net asp.net-mvc entity-framework foreign-keys

我有两个通过一对多关系关联的类。一个类别可以有多个产品,一个产品只能有一个类别。

模型

Models / Category.cs:

namespace Projeto.Models
{
    public class Category
    {
        public int CategoryId { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Product> Products { get ; set; }
        public ICollection<CategoryCategory> CategoryParent { get; set; } 
        public ICollection<CategoryCategory> CategoryChild { get; set; } 
    }
}

Models / Product.cs:

namespace Projeto.Models
{
    public class Product
    {
        public int ProductId { get; set; }
        public string Name { get; set; }

        public virtual Category Category { get; set; }
}

问题

当我执行POST或PUT尝试更新给定产品的“类别”时,返回以下错误:

请求正文(HttpPut):

{
    "productId": 1,
    "name": "testing",
    "category": 1
}

响应:

{
    "category": [
        "Error converting value 1 to type 'Projeto.Models.Category'. Path 'category', line 4, position 15."
    ]
}

可能的解决方案

我已经尝试过'虚拟'数据类型的多种组合,我已经看到它可以解决此问题,但是永远无法修复该错误并使CRUD操作按预期运行。我也尝试过[ForeignKey]数据注解,再次没有运气:

public int CategoryMetaID;
[ForeignKey("CategoryMetaID")]
public virtual Category Category { get; set; }

诚然,我对C#,ASP.NET MVC或实体框架本身不了解很多,所以这可能是一个新手错误。但是,我设法建立了一个可以发布和更新多对多关系(产品具有产品)的有效API,但似乎无法解决这个多对多外键关系问题。

任何启发将不胜感激。 预先感谢!

1 个答案:

答案 0 :(得分:0)

很明显,在下面

{
"productId": 1,
"name": "testing",
"category": 1
}

“类别”:1 无法绑定到类别

的对象
public virtual Category Category { get; set; }

因此,要纠正此错误,您必须知道Web api使用json fomatter将传入的对象解析为C#POCO对象。这是Json.Net库

因此您可以使用以下标签将这个属性标记为忽略

[JsonIgnore]
public virtual Category Category { get; set; }

在产品类上放置错误的方法,巫婆是外键,并将其添加到类别类中

更改产品类别并添加

public int CategoryId { get; set; }
[JsonIgnore]
public virtual Category Category { get; set; }

更改类别类并添加此

[ForeignKey("CategoryId")]
public virtual ICollection<Product> Products { get ; set; }

我认为这会对您有所帮助。请尝试