首页 > 解决方案 > 错误无法在 C# 中的表中插入标识列的显式值

问题描述

我试图在数据库中保存多条记录,数据正确存储在列表中,但是当我按下按钮保存到数据库中时,它不起作用。

列表中只有一条记录并按下按钮 2 没有任何反应,但列表中有超过 2 条记录并按下按钮 2 程序崩溃并出现以下错误代码:

Microsoft.EntityFrameworkCore.DbUpdateException: '更新条目时出错。有关详细信息,请参阅内部异常。

SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“roll”中插入标识列的显式值

我的错误是什么?

变量:

    int p = 0;
    string x = "";
    decimal xx = 0;
    string v = "";
    decimal vv = 0;
    string f = "";
    decimal ff = 0;
    decimal pp = 0;
    List<int> piece = new List<int>();
    List<string> protein = new List<string>();
    List<string> vegetable = new List<string>();
    List<string> wrapped = new List<string>();
    List<decimal> piecePrice = new List<decimal>();
    List<decimal> proteinPrice = new List<decimal>();
    List<decimal> vegetablePrice = new List<decimal>();
    List<decimal> wrappedPrice = new List<decimal>();

按钮点击:

private void button1_Click(object sender, EventArgs e)
{
        piece.Add(Convert.ToInt32(comboBox1.SelectedValue.ToString()));
        protein.Add(comboBox2.SelectedValue.ToString());
        vegetable.Add(comboBox3.SelectedValue.ToString());
        wrapped.Add(comboBox4.SelectedValue.ToString());

        for (int i = 0; i < piece.Count(); i++)
        {
            var p = piece[piece.Count - 1];
            var h = protein[protein.Count - 1];
            var v = vegetable[vegetable.Count - 1];
            var f = wrapped[ wrapped.Count - 1];

            using (var context = new AppDbContext())
            {
                 piecePrice.Add(Convert.ToDecimal(context.piece.SingleOrDefault(x => x.quantity == p)?.price));
                proteinPrice.Add(Convert.ToDecimal(context.protein.SingleOrDefault(x => x.name == h)?.price));
                vegetablePrice.Add(Convert.ToDecimal(context.vegetable.SingleOrDefault(x => x.name == h)?.price));
                wrappedPrice.Add(Convert.ToDecimal(context. wrapped.SingleOrDefault(x => x.name == f)?.price));
            }
        }
}

保存按钮单击处理程序:

private void button2_Click(object sender, EventArgs e)
{
        List<rolls> rolls = new List<rolls>();

        for (int i = 0; i < piece.Count(); i++)
        {
            p = piece[i];
            pp = piecePrice[i];
            x = protein[i];
            v = vegetable[i];
            f =  wrapped[i];
            xx = proteinPrice[i];
            vv = vegetablePrice[i];
            ff =  wrappedPrice[i];

            using (var context = new AppDbContext())
            {
                rolls.Add(new rolls()
                    {
                        quantity = p,
                        quantity_price = pp,
                        protein = x,
                        protein_price = xx,
                        vegetable = v,
                        vegetable_price = vv,
                        wrapped = f,
                        wrapped_price = ff
                    });

                context.AddRange(rolls);
                context.SaveChanges();
            }
        }
}

劳斯莱斯表:

 public class rolls
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int rollId { get; set; }

        public int quantity { get; set; }
        public decimal quantity_price { get; set; }
        public string protein { get; set; }

        public decimal protein_price { get; set; }
        public string vegetable { get; set; }

        public decimal vegetable_price { get; set; }
        public string wrapped { get; set; }

        public decimal wrapped_price { get; set; }

    }

标签: c#entity-framework

解决方案


我的第一印象是你想在你的劳斯莱斯列表中插入相同的值。从 for 循环中删除“using(){...}”代码行。只需为插入过程准备您的列表。当 for 循环结束时,您可以使用 AddRange 函数插入列表数据。

private void button2_Click(object sender, EventArgs e)
{
    List<rolls> rolls = new List<rolls>();
    for (int i = 0; i < piece.Count(); i++)
    {
        p = piece[i];
        pp = piecePrice[i];
        x = protein[i];
        v = vegetable[i];
        f =  wrapped[i];
        xx = proteinPrice[i];
        vv = vegetablePrice[i];
        ff =  wrappedPrice[I];

        rolls.Add(new rolls()
                {
                    quantity = p,
                    quantity_price = pp,
                    protein=x,
                    protein_price=xx,
                    vegetable=v,
                    vegetable_price=vv,
                    wrapped=f,
                     wrapped_price = ff

        });
    }

    using (var context = new AppDbContext())
    {
       context.AddRange(rolls);
       context.SaveChanges();
    }
}

另一种选择是您要插入带有标识列(ID 或您的 Rolls 表的列之一)的记录,但该列不能插入。请检查一下。


推荐阅读