【问题标题】:How to update multiple records in a table Using the Linq for Entity Framework Core如何使用 Linq for Entity Framework Core 更新表中的多条记录
【发布时间】:2021-09-13 04:10:51
【问题描述】:

我目前面临更新数据库中多条记录的问题。我想在用户付款时创建收据时更新用户创建的项目列表。

这是我更新它们的 API 方法。

[HttpPut("update-items")]
public ActionResult UpdateListOfItems(IEnumerable<ItemUpdateDTO> itemUpdateDTOs)
{
    if(itemUpdateDTOs == null)
    {
        return BadRequest();
    }

    var items = _mapper.Map<IEnumerable<Item>>(itemUpdateDTOs);
    _repository.UpdateRangeItem(items);

    return Ok("Updated items!");
}

这是我的项目更新 DTO

public class ItemUpdateDTO
{
    [Required]
    public int ID { get; set; }
    public FishUpdateDTO Fish { get; set; }
    [Required]
    public ReceiptUpdateDTO Receipt { get; set; }
}

这是表“Item”的实体模型

public class Item
{
    [Key]
    public int ID { get; set; }
    [Required]
    public int FishID { get; set; }
    public Fish Fish { get; set; }
    [Required]
    public int QuantityOrdered { get; set; }
    [Required]
    public float TotalPrice { get; set; }
    public Receipt Receipt { get; set; }
    public User Customer { get; set; }
}

这是“类别”的实体模型

public class FishCategory
{
    [Key]
    [Required]
    public int ID { get; set; }
    [Required]
    [MaxLength(50)]
    public string Category { get; set; }
    public IEnumerable<Fish> Fish { get; set; }
}

这里是存储库方法。

public void UpdateRangeItem(IEnumerable<Item> items)
{
    _databaseContext.Items.UpdateRange(items);
    _databaseContext.SaveChanges();
}

这里是物品表:

和收据表:

我正在尝试使用收据 id 作为项目表中的外键来更新项目表。但是,我收到一个错误:

UPDATE 语句与 FOREIGN KEY 约束“FK_Fishes_Categories_CategoryID”冲突。冲突发生在数据库“EFishing”、表“dbo.Categories”、列“ID”中。

目前,我正在使用称为 UpdateRange()DatabaseContext 方法在一次调用数据库中更新一系列行。

任何解决方案都可以。谢谢

【问题讨论】:

  • 您遇到 SQL Server 错误,提示您发送到 Fish 表的数据无效。您可以添加 Fish 表的定义,以及您作为itemUpdateDTOs 发送的数据吗?
  • 另外,请注意语言 sn-p 功能仅适用于 JS/HTML,并非适用于所有语言。
  • 您为什么不查看您发送的数据 (items)?很明显,您正在尝试保存表Category 中不存在的CategoryID。这就是我们可以告诉您的全部内容,但这只是对异常消息的重新表述。
  • @GertArnold 感谢您重新表述异常消息,但有趣的是,“类别”表中有数据。
  • @GertArnold 我明白你的意思。我设法通过仅传递“categoryId”而不是另一个“Category”类型的内部类来解决它。

标签: c# asp.net-core asp.net-web-api entity-framework-core asp.net-core-webapi


【解决方案1】:

该问题与一次多次更新项目无关。

正如 SQL Server 告诉您的,它与 Fish 和类别有关。

您的一个或多个项目上可能有一条鱼,这条鱼指向一个不存在的 FishCategory,因此违反了外键。

未设置但定义为不可为空的外键将采用值“0”(整数的默认值),并且如果您的 id 从 1 开始以同样的方式失败。也许可以为空的 FK 可能会有所帮助(如果它在数据方面有意义的话)。

验证您的数据库结构和您尝试保存的数据:项目的鱼属性和鱼的类别。

【讨论】:

    【解决方案2】:

    所以我知道已经晚了,但这是我的答案,它解决了我的问题。

    因为问题就在这个->

    UPDATE 语句与 FOREIGN KEY 约束“FK_Fishes_Categories_CategoryID”冲突。冲突发生在数据库“EFishing”、表“dbo.Categories”、列“ID”中。

    这是由于我的 Categories 表中不存在特定的 CategoryID,因此引发了该错误。编译器产生的错误可能不包含有用的消息,但检查您发布的数据(可能使用 Postman),请检查与您的实体有关系的相关数据是否存在。

    例如,如果我有

    类别表 |类别ID |类别 | | -------- | -------------- | | 1|盐水| | 2|淡水|

    这是鱼表 |鱼ID|姓名|类别ID| |:---- |:-----:| -----:| | 1|三文鱼| 1| 但是在 Postman 或您用于将数据发布到 API 的任何软件中,如果您将“Fish”数据发布到“CategoryID”为 3 的 Fish 表中,则会发生错误并按上述方式打印。因此,请确保您在 Category 表中存在“CategoryID: 3”。

    感谢@AFract。他在一些容易出错的可能性中的回答高于我的回答。

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 1970-01-01
      • 2020-12-06
      • 2014-11-11
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      相关资源
      最近更新 更多