【问题标题】:Saving entities related by foreign key (POST/PUT Request) in Entity Framework, ASP.NET-MVC在实体框架、ASP.NET-MVC 中保存通过外键(POST/PUT 请求)相关的实体
【发布时间】:2018-12-09 03:54:13
【问题描述】:

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

型号

模型/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; } 
    }
}

模型/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,但似乎无法解决这个单对多外键关系问题。

任何启示将不胜感激。 提前致谢!

【问题讨论】:

  • 您必须提供更新数据库的 api 和代码。在这里,您只是提供了模型,而这些信息不足以找到问题
  • 包含更新数据库代码的控制器是通过脚手架生成的。 HttpPut sn-p:pastebin.com/yNVBinbi

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


【解决方案1】:

很明显,在下面

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

"category": 1 无法绑定到 Category 类型的对象

public virtual Category Category { get; set; }

所以要纠正这个错误,你必须知道 web api 使用 json fomatter 将传入的对象解析为 C# POCO 对象。这是 Json.Net 库

因此您可以标记此属性以在使用以下绑定时忽略

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

执行此操作的标准方法是在 Product 类上加上外键,并将其添加到 Category 类中

更改产品类别并添加它

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

更改类别类并添加此

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

我认为这会对你有所帮助。请尝试一下

【讨论】:

  • 感谢您的回复!发送问题中描述的相同 PUT 请求时,我收到以下错误:SqlException:UPDATE 语句与 FOREIGN KEY 约束“FK_Product_Category_CategoryMetaID”冲突。冲突发生在数据库“ProjectContextDatabase”、表“dbo.Category”、列“CategoryID”中。关于如何编辑“产品”实体的模型构建器以在更新时将其设置为 UPDATE/DELETE 的任何想法?
  • 告诉我你到底要更新什么?您尝试更新产品或插入产品?默认情况下,级联更新和删除在 EF 中处于打开状态,您可以根据需要将其关闭。
  • 我正在尝试更新“类别”字段或现有的“产品”。
  • iirc,如果发件人下发,json 格式化程序将输入默认值。所以在这种情况下,如果我省略了类别,json 格式化程序会将 null 绑定到引用类型;同样,iirc,如果要更新或添加外键,只需填写外键属性并省略对象引用即可。在这种情况下,就 EF 而言,只要填写 categoryId 并将 Category 留空,当然,如果 EF 知道外键 categoryId。然而,问题是这是否是最佳实践?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
相关资源
最近更新 更多