【问题标题】:Failed to insert data into the database向数据库中插入数据失败
【发布时间】:2021-04-09 10:09:52
【问题描述】:

首先,我从会话中挑选数据。我试图将这些数据转移到另一个模型。但是我的第一个数据(会话)是否已成功上传到数据库中。第一个数据传输成功。但是第二个第三个第四个无论如何,这些数据无法传输我的模型。

这是我的代码:

public async Task<IActionResult> Checkout(Order11 anOrder) {
    List<Shop> shop = HttpContext.Session.Get<List<Shop>>("shop");

    for (int i = 0; i < shop.Count(); i++) {
        if (shop != null) {
            anOrder.ProductName = shop[i].Name;
            anOrder.ImagePath = shop[i].Image;
            anOrder.Price = shop[i].Price;
            anOrder.Quantity = shop[i].Quantity;

            anOrder.OrderNo = GetOrderNo();

            _db.Order11.Add(anOrder);
        }

        _db.SaveChanges();
    }

    // other code
}

Order11.cs

  public class Order11
    {
        public int Id { get; set; }
        [Display(Name = "Order Number")]
        public string OrderNo { get; set; }
        [Required]
        public string Name { get; set; }
        [Required]
        [Display(Name = "Phone Number")]
        public string PhoneNo { get; set; }
        [Required]
        [EmailAddress]
        public string Email { get; set; }
        [Required]
        public string Address { get; set; }

        public DateTime OrderDate { get; set; }
        public string ImagePath { get; set; }

        public int Quantity { get; set; }

        public int Price { get; set; }
        public string ProductName { get; set; }

    }
}

当我运行应用程序时,我得到了这个错误:

我想将所有会话数据传输到我的模型(数据库)中。这个问题的解决方案是什么?我是初学者请帮忙。

【问题讨论】:

  • anOrder 的 key 属性不是默认值(意味着它被分配给一些有效的非零值)。我想它的键可能是Id,它是自动递增的(由db自动生成),不应该显式地分配一个值。你应该检查一下。如果要添加,则应忽略 key 属性,将其重置为零值(例如:0 表示 int),然后再将其添加到 DbContext
  • 就在你方法的开头Checkout,也可以先调试一下,看看是不是像我说的那样。但是,您还应该在此处的方法中传递实体之前找出为什么将 key 属性分配给某个非零值,这样您可能会在执行流程的早期发现错误。如果将其设置回零无论如何都可以,那就去做吧。
  • 您能否发布Order11 模型,以便清楚您的身份列是什么
  • @BrettLee 当然你设置了多个属性的值,但这里的重点是关键属性值(在你发布的模型类中,它是Id)。您是否看到该 Id 的任何指定值?使用 ViewModel 只是设计方法的另一种方式,问题是要了解您的目标、方法的作用、它需要什么以及输出效果是什么(正如我在上面已经评论过的)。
  • @BrettLee Id 是在第一个循环之后生成的,因此您看到的错误会在第二个循环中引发。我错过了您将SaveChanges 放入循环中的观点。这根本没有意义。你在很多方面都做错了,现在我不明白你到底想要什么。

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


【解决方案1】:

请在保存数据前设置anOrder.Id = 0;

【讨论】:

  • 代码可以在添加的情况下工作,但 OP 甚至可能不知道它的效果是否是期望的/预期的,例如:稍后他可能会发现一些订单应该更新而是添加(克隆为重复)=))
  • OP 正在循环中保存相同的模型。首次保存后,ID 将使用主键值更新。因此,每次调用 savechanges() 时都需要将 Id 重置为 0。
  • 啊,我明白了,错过了这一点。所以他的代码看起来像是一个克隆工作(来自一个传入的实体)。那可能仍然不是他想要的。
  • 这里肯定有设计缺陷。但我不评判。
【解决方案2】:

请使用 try、catch 显示内部异常。我无法发表评论。

public async Task<IActionResult> Checkout(Order11 anOrder)
{
List<Shop> shop = HttpContext.Session.Get<List<Shop>>("shop");

for (int i = 0; i < shop.Count(); i++)
{
    try
    {
    if (shop != null)
    {
        anOrder.ProductName = shop[i].Name;
        anOrder.ImagePath = shop[i].Image;
        anOrder.Price = shop[i].Price;
        anOrder.Quantity = shop[i].Quantity;

        anOrder.OrderNo = GetOrderNo();

        _db.Order11.Add(anOrder);
    }

    _db.SaveChanges();
    }
    catch(Exception ex)
    {
    }
}

// other code
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多