c# - 错误无法在 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; }
}
解决方案
我的第一印象是你想在你的劳斯莱斯列表中插入相同的值。从 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 表的列之一)的记录,但该列不能插入。请检查一下。
推荐阅读
- javascript - 输入中的自动完成数据
- java - Gradle 任务不接受 Java 用户输入
- python - 在 PyQt5 中删除小部件时如何删除黑色空间
- system-verilog - SystemVerilog 中队列的最大大小是多少?
- node.js - Traefik 仍然需要端口规范
- excel - 如何在工作簿中搜索字符串然后将其写入同一行的列中?
- php - Laravel 调度程序和 docker cron
- excel - 使用 Excel 溢出范围作为递归 Lambda 函数的数据源
- python - 可以重建 2d 矩阵,其中掩码已与 numpy where 一起使用并展平
- makefile - 如何让 make 运行使用 make 变量在其中创建 azure 服务主体的命令