在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()"之类的?基本上,我只需要插入这些记录。我做错了什么?
谢谢!
您发布的代码将工作,假设这两个字段都没有identity
值。基本上需要确保在将项添加到Table集合之前不会尝试设置标识值。(实际上,在大多数情况下,当要在DB中生成标识值时,您不应该从代码中设置标识值)。
所以在某个地方,有一个错误的代码是试图设置标识字段的值
如果ID很重要(假设您正在导入数据,稍后要插入的记录将引用这些记录),那么在执行插入时暂时关闭标识。如果在每条记录上有一个特定的ID并不重要,并且可以让标识列选择一个(99.9%的情况下是这样),那么在尝试保存记录之前,请确保没有为ID指定值。还要确保对象和DB之间的映射指定ID是一个标识,这样EF就知道不要尝试插入ID列。
检查以确保您的主键/标识列在DBML中具有以下设置:
- 自动生成值:True
- 自动同步:OnInsert
这将确保LINQ-To-SQL不会尝试将键值插入到该列中,并且在插入发生后更新该值。当您将表添加到DBML中时,这些应该是打开的。