C# 无法将数据插入数据库

C# 无法将数据插入数据库,c#,asp.net-mvc,asp.net-core,entity-framework-core,asp.net-core-mvc,C#,Asp.net Mvc,Asp.net Core,Entity Framework Core,Asp.net Core Mvc,首先,我从会话中选取数据。我试图将这些数据转移到另一个模型。但我的第一次数据(会话)已成功上载到数据库。第一次数据传输成功。但是第二,第三,第四,不管怎样,这些数据不能传递我的模型 这是我的密码: public async Task<IActionResult> Checkout(Order11 anOrder) { List<Shop> shop = HttpContext.Session.Get<List<Shop>>("sh

首先,我从会话中选取数据。我试图将这些数据转移到另一个模型。但我的第一次数据(会话)已成功上载到数据库。第一次数据传输成功。但是第二,第三,第四,不管怎样,这些数据不能传递我的模型

这是我的密码:

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
}
运行应用程序时,会出现以下错误:


我想将所有会话数据传输到我的模型(DB)中。这个问题的解决办法是什么?我是初学者,请帮助。

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

请使用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
}
公共异步任务签出(Order11-anOrder)
{
List shop=HttpContext.Session.Get(“shop”);
对于(int i=0;i
anOrder的键属性不是默认值(意味着它被分配给了一些有效的非零值)。我想它的键可能是
Id
,它是自动递增的(由db自动生成),不应该显式地分配一个值。你应该检查一下。如果要添加密钥属性,则在将其添加到
DbContext
之前,应通过将其重置回零值(例如:
0
for int)来忽略该密钥属性。在方法
签出
的最开始,也要先尝试调试,看看是否与我所说的相同。但是,您还应该了解为什么在将实体传递到您的方法之前将key属性分配给某个非零值,这样您可能会在执行流的前面发现一些错误。如果将其设置回零也可以,那么就这样做。您可以发布
Order11
模型以使其干净吗?您的身份是什么column@BrettLee当然,您可以为多个属性设置值,但这里的要点是关键属性值(与您发布的模型类一样,它是
Id
)。您是否看到该
Id
的任何赋值?使用ViewModel只是设计方法的另一种方式,问题是要理解您的目标、方法的作用、它需要什么以及输出效果是什么(正如我上面已经评论过的)。@Brettle
Id
是在第一个循环之后生成的,因此您看到的错误会在第二个循环中抛出。我错过了您将
SaveChanges
放入循环的要点。这完全没有道理。你在很多方面都做错了,现在我不明白你到底想要什么。添加了这个代码后,代码可以工作,但OP甚至可能不知道它的效果是否理想/预期,例如:稍后他可能会发现一些订单应该更新,但改为添加(克隆为重复项)=)。OP正在循环中保存相同的模型。首次保存自身后,ID将用主键值更新。因此,每次调用savechanges()时,都需要将Id重置为0。啊,我明白了,忽略了这一点。因此,他的代码看起来像一个克隆作业(来自传入的一个实体)。这可能仍然不是他想要的。这里肯定有一个设计缺陷。但我不是在评判。
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
}