English 中文(简体)
IDENTITY INSERT和LINQ to SQL
原标题:IDENTITY INSERT and LINQ to SQL

我有一个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作为标识。但是,我不知道应该是什么。有人能帮我吗?

谢谢

最佳回答

这听起来很简单,就好像你的模型没有意识到它一个身份;ID列应标记为db生成(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,所以只需重新生成此类(通过删除设计器中的表并再次将其从服务器资源管理器中删除)。

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

看看这个:

使用实体键

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

The simplest way is: 1. open dbml 2. Select class for inserting 3. Select column with primary-key 4. check Auto Generated Property in properties window (it should be set to True)





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签