使用 C# 出现错误“无法在表中插入标识列的显式值”

Posted

技术标签:

【中文标题】使用 C# 出现错误“无法在表中插入标识列的显式值”【英文标题】:Error "Cannot insert explicit value for identity column in table" using C# 【发布时间】:2021-03-10 20:05:19 【问题描述】:

我在使用简单的本地 SQL 数据库时遇到问题。我对数据库或使用 C# 访问它们不是很了解,所以任何帮助将不胜感激。我正在尝试使用 C# 通过 Linq to SQL 向我的数据库中的一个表添加一个条目。这是我的sn-p代码。

using (DataClasses1DataContext db = new DataClasses1DataContext())

    tbl_Inventory inv = new tbl_Inventory();
    inv.Title = addTitleTextBox.Text;
    inv.Model = addModelTextBox.Text;
    inv.Category = addCategoryTextBox.Text;
    inv.Quantity = int.Parse(addQuantityTextBox.Text);
    inv.Price = decimal.Parse(addPriceTextBox.Text);
    inv.Description = addDescriptionTextBox.Text;

    db.tbl_Inventories.InsertOnSubmit(inv);
    db.SubmitChanges();

    int id = inv.IdProducts;

    MessageBox.Show($"Item creation successful. Item number is id");

我不断收到以下错误:

当 IDENTITY_INSERT 设置为 OFF 时,无法为表 'tbl_Inventory' 中的标识列插入显式值

我的表有一个名为 IDProducts 的列,它用作标识列以递增 1。我可以在 Visual Studio 设计窗口中添加条目,它添加的条目没有错误,增量工作正常,但不是当我运行我的代码时。问题是我的代码没有尝试为IDProducts 赋值。我尝试删除 IDProducts 并将其添加回来,但我仍然遇到同样的错误。我通过 Visual Studio 创建了另一个表,其方式与上面的代码非常相似,将条目添加到表中,我没有任何问题。我不确定我可能会做些什么不同的事情。

【问题讨论】:

这能回答你的问题吗? Cannot insert explicit value for identity column in table 'table' when IDENTITY_INSERT is set to OFF 看看这篇文章:appuals.com/… 您必须在数据库中将Identity 设置为true。分享一张你在 SQL server 中的表设计图 我认为真正的问题是你的 C# 模型类没有正确告诉 Linq-to-SQL IDProducts 列是数据库生成的标识列 - 你能告诉我们 C#模型类? 【参考方案1】:

您的 C# 模型类似乎没有将 IDProducts 列正确定义为 IDENTITY 列 - 因此您的 Linq-to-SQL 代码尝试将值插入标识列,这会导致错误。

您需要确保正确注释您的列 - 因为我不知道您的 tbl_Inventory 类是什么样的,所以我只能向您展示:

[Table(Name="Inventory")]     // or whatever it really is ...
public class tbl_Inventory   

    [Column(IsPrimaryKey=true,IsDbGenerated=true)]
    public int IDProducts  get; set; 

    // all your other columns here
  

您需要将 IsDbGenerated 注释添加到您的 IDProducts 列,以便 Linq-to-SQL 在插入时知道这是数据库正在生成值的列。

【讨论】:

感谢您的意见。我最终解决了那部分。我查看了我的 DataClasses.dbml 并在 IdProducts 属性中将自动生成的值设置为 false。不知道为什么它不像我的其他表那样自动设置。我将其设置为 true 并将 Auto-Sync 设置为 OnInsert 并开始工作。我的 MessageBox.Show 现在正在执行,如果我提交多个条目,它将显示它正在递增,但我没有看到保存到表中的数据,并且当我退出程序并再次启动时,增量将重新开始。如果我无法弄清楚,我会解决一些问题并提交另一篇文章。

以上是关于使用 C# 出现错误“无法在表中插入标识列的显式值”的主要内容,如果未能解决你的问题,请参考以下文章

实体框架抛出无法在表中插入标识列的显式值...当 IDENTITY_INSERT 设置为 OFF 错误

c# 出现OutofMemory错误

使用 VS2010 在 C# 上出现 Wininet.dll 错误

C# 中连接SQLServer 出现内部致命错误

出现错误:使用 AJAX POST 到 C# Web 方法时出现 500 内部服务器错误

删除代码时有啥方法不会出现设计器错误? (C#、Visual Studio、WinForms)