IDENTITY INSERT和LINQ to SQL

我有一个SQL Server数据库。 该数据库有一个名为Item的表。 Item有一个名为“ID”的属性。 ID是我桌子上的主键。 此主键是一个增量值为1的int。当我尝试插入记录时,收到一条错误消息:

当IDENTITY_INSERT设置为OFF时,无法在表’Item’中为identity列插入显式值。“

我试图使用以下代码插入记录:

public int AddItem(Item i) { try { int id = 0; using (DatabaseContext context = new DatabaseContext()) { i.CreatedOn = DateTime.UtcNow; context.Items.InsertOnSubmit(i); context.SubmitChanges(); id = i.ID; } return id; } catch (Exception e) { LogException(e); } } 

当我在提交之前查看i.ID时,我注意到i.ID设置为0.这意味着我试图插入0作为标识。 但是,我不确定它应该是什么。 有人可以帮我吗?

谢谢!

听起来好像你的模型不知道它一个身份; ID列应标记为db-generated(UI中的Auto Generated Value ,或xml中的IsDbGenerated ),并可能作为主键。 然后它不会尝试插入它,并在写入后正确更新值。

将ID属性的“自动生成”属性设置为“True”。

检查Item类中的ID属性,确保它具有如下属性:

 [Column(Storage="_ID", AutoSync=AutoSync.OnInsert, DbType="INT NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)] 

看看IsDbGenerated=true ,这是重要人物。

也许您在调整Sql Server上的IDENTITY之前使用设计器创建了DatabaseContext ,因此只需重新生成此类(通过删除设计器中的表并再次从Server Explorer中删除它)。

在您调用context.SubmitChanges();之前,ID将为零。 在调用SubmitChanges之后,逐步执行代码并查看值。 请记住,DB实际上是在分配ID(假设它是一个自动增量键)。

看看这个:

使用实体密钥

您必须在映射中定义在数据库中生成id。 执行此操作的方式取决于您使用的映射类型。 如果您使用的是代码属性,请确保在ColumnAttribute属性的IsDbGenerated中指定IsDbGenerated (或在XML映射中)。 如果您使用dbml文件,请确保将“自动生成的值”设置为true。

最简单的方法是:1。打开dbml 2.选择要插入的类3.使用主键选择列4.在属性窗口中选中Auto Generated Property(应设置为True)