IDENTITY INSERT 和 LINQ to SQL

Posted

技术标签:

【中文标题】IDENTITY INSERT 和 LINQ to SQL【英文标题】:IDENTITY INSERT and LINQ to SQL 【发布时间】:2011-05-26 13:20:49 【问题描述】:

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

谢谢!

【问题讨论】:

您确定将该列设置为数据库中的主键,并且您的 Linq to Sql 生成的类反映了这一点。我知道有时我忘记将列标记为主键,然后我生成的类需要更新。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

这对我来说是关键。【参考方案4】:

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

看看这个:

Working with Entity Keys

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于IDENTITY INSERT 和 LINQ to SQL的主要内容,如果未能解决你的问题,请参考以下文章

如果存在-UPDATE-else-INSERT 与 Linq-to-Entities?

LINQ to SQL语句(10)之Insert

Linq To SQL和Linq To Object的批量操作InsertAllOnSubmit介绍

Linq to SQL -- InsertUpdateDelete

SET IDENTITY_INSERT 从 SQL Server 2000 到 2005 的行为有何不同?

insert to一条记录到access中,数据库会自动产生一个自增长的ID,我想插入之后返回这个ID,请问如何做?