13

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

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

我正在尝试使用以下代码插入记录:

  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 作为身份。但是,我不确定它应该是什么。有人可以帮我吗?

谢谢!

4

6 回答 6

10

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

于 2011-05-26T13:25:04.620 回答
7

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

于 2011-05-26T13:24:58.443 回答
7

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

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

IsDbGenerated=true,这是这里的重要人物。

也许您DatabaseContext在调整IDENTITYSql Server 之前使用设计器创建了该类,因此只需重新生成此类(通过删除设计器中的表并再次从服务器资源管理器中删除它)。

于 2011-05-26T13:32:49.687 回答
2

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

看看这个:

使用实体键

于 2011-05-26T13:23:43.127 回答
0

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

于 2011-05-26T13:27:31.343 回答
0

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

于 2014-08-03T09:21:25.940 回答