在c#中从LINQ写入数据库

本文关键字:数据库 LINQ 中从 | 更新日期: 2023-09-27 17:52:57

我试图通过LINQ写一些内容到我的数据库。目前,我得到以下错误:

Cannot insert explicit value for identity column in table 'MyTable' when IDENTITY_INSERT is set to OFF.

我理解这是一个与主键相关的问题。我的表的标识规范设置为"Yes",标识增量设置为"1"。但是我已经成功地使用如下代码更新了其他表:

using (DataModelDataContext context = new DataModelDataContext())
{
  List<MyTable> newRecords = new List<MyTable>();
  MyTable record1 = new MyTable();
  record1.CreatedBy = GetUserName();
  record1.Information = GetInformation();
  newRecords.Add(record1);
  MyTable record2 = new MyTable();
  record2.CreatedBy = GetUserName();
  record2.Information = GetInformation();
  newRecords.Add(record2);
  context.MyTables.InsertAllOnSubmit(newRecords);
  context.SubmitChanges();
}

什么会导致这个错误?如果我想写新记录,有没有办法在它被发送到数据库之前设置主键?比如"GetNextKey()"之类的?基本上,我只需要插入这些记录。我做错了什么?

谢谢!

在c#中从LINQ写入数据库

您发布的代码将工作,假设这两个字段都没有identity值。基本上需要确保在将项添加到Table集合之前不会尝试设置标识值。(实际上,在大多数情况下,当要在DB中生成标识值时,您不应该从代码中设置标识值)。

所以在某个地方,有一个错误的代码是试图设置标识字段的值

如果ID很重要(假设您正在导入数据,稍后要插入的记录将引用这些记录),那么在执行插入时暂时关闭标识。如果在每条记录上有一个特定的ID并不重要,并且可以让标识列选择一个(99.9%的情况下是这样),那么在尝试保存记录之前,请确保没有为ID指定值。还要确保对象和DB之间的映射指定ID是一个标识,这样EF就知道不要尝试插入ID列。

检查以确保您的主键/标识列在DBML中具有以下设置:

  • 自动生成值:True
  • 自动同步:OnInsert

这将确保LINQ-To-SQL不会尝试将键值插入到该列中,并且在插入发生后更新该值。当您将表添加到DBML中时,这些应该是打开的。