IDENTITY INSERT和LINQ to SQL

时间:2011-05-26 13:20:50

标签: c# .net linq-to-sql identity-insert

我有一个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作为标识。但是,我不确定应该是什么。有人可以帮助我吗?

谢谢!

6 个答案:

答案 0 :(得分:10)

听起来好像你的模型没有意识到身份的事实; ID列应该在UI中标记为db-generated(Auto Generated Value,或者在xml中标记为IsDbGenerated),并且可能作为主键。然后它不会尝试插入它,并在写入后正确更新值。

答案 1 :(得分:7)

将ID Property的“Auto Generated”属性设置为“True”。

答案 2 :(得分:6)

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

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

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

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

答案 3 :(得分:2)

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

看看这个:

Working with Entity Keys

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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