2011-05-26 94 views
13

我有一个SQL Server数据库。这个数据库有一个名为Item的表。 Item有一个名为“ID”的属性。 ID是我桌子上的主键。此主键以1为增量值的int当我尝试插入记录,我收到一个错误,指出:IDENTITY INSERT和LINQ to SQL

当IDENTITY_INSERT设置

无法插入表“项目”标识列显式值。到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提交之前,我注意到i.ID被设置为0这意味着我试图插入0作为身份不管怎样,我不确定它应该是什么。有人可以帮我吗?

谢谢!

+0

是否确定将该列设置为数据库中的主键,并且您的Linq to Sql生成的类反映了该列。我知道有时候我忘了标记一个列作为主键,然后我生成的类需要更新。 – 2011-05-26 13:26:44

回答

9

这听起来很简单,仿佛你的模型不知道它的事实的身份;应该将ID列标记为数据库生成的(UI中的Auto Generated Value或xml中的IsDbGenerated),并且可能将其作为主键。然后它不会尝试插入它,并且在写入之后将正确地更新该值。

2

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

看看这个:

Working with Entity Keys

7

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

0

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

6

检查ID财产Item类中,以确保它有一个像这样的属性:

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

看那IsDbGenerated=true,它是这里最重要的人。

也许你使用设计调整SQL Server上的IDENTITY之前,所以才重新生成这个类(通过删除在设计表,并从服务器资源管理器再次下探)共同创造的DatabaseContext

0

最简单的方法是:1。 开放的dbml 2.选择类,在属性窗口中生成的属性(应该设置为True)

主键 4.检查自动插入 3.选择列