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和Linq To Object的批量操作InsertAllOnSubmit介绍
Linq to SQL -- InsertUpdateDelete