身份插入和LINQ to SQL

13

我有一个 SQL Server 数据库。这个数据库有一张名为 Item 的表。Item 表拥有一个名为“ID”的属性,它是该表的主键。这个主键是一个 int 类型的自增值,每次加 1。当我尝试插入记录时,会收到以下错误提示:

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

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

  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 的值时,发现其被设置为0。这意味着我正在尝试将0作为标识插入。但是,我不确定应该是什么值。有人能帮忙吗?

谢谢!


你确定在数据库中将该列设置为主键,并且你的 Linq to Sql 生成的类反映了这一点吗?我知道有时候我会忘记将某一列标记为主键,然后我的生成的类就需要更新。 - ek_ny
6个回答

10

听起来你的模型似乎没有意识到它自己是一个身份标识;ID列应该标记为数据库生成的(在UI中称为Auto Generated Value,或在xml中称为IsDbGenerated),并且可能是主键。然后它将不会尝试插入它,并在写入后正确地更新值。


7

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

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

看一下IsDbGenerated=true,它是这里的重要角色。

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


1
这对我来说是关键。 - EGC

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

2
直到您调用context.SubmitChanges()方法之前,ID将为零。在调用SubmitChanges方法后,请逐步执行代码并查看值。请记住,数据库实际上正在分配ID(假设它是自增键)。
请看这个:使用实体键

0

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


0
最简单的方法如下: 1. 打开 dbml 文件 2. 选择要插入的类别 3. 选择具有主键的列 4. 在属性窗口中检查“自动生成的属性”(应设置为True)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接