【发布时间】:2019-06-25 01:42:22
【问题描述】:
我有一个表,它从一个序列中生成它的主键(从 0 开始计数):
CREATE TABLE [dbo].[testTable](
[id] [int] NOT NULL,
[a] [int] NOT NULL,
CONSTRAINT [PK_testTable] PRIMARY KEY CLUSTERED ([id] ASC))
ALTER TABLE [dbo].[tblTestTable] ADD CONSTRAINT [DF_tblTestTable_id] DEFAULT (NEXT VALUE FOR [seq_PK_tblTestTable]) FOR [id]
我使用 Visual Studio 的 O/R 设计器为表创建映射文件; id 字段定义为:
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_id", DbType="Int NOT NULL", IsPrimaryKey=true)]
public int id {…}
现在我正在尝试通过 LINQ 插入数据。
var testTableRecord = new testTable()
{
a = 1,
};
db.Connection.Open();
db.testTables.InsertOnSubmit(testTableRecord);
db.SubmitChanges();
Console.WriteLine($"id: {testTableRecord.id}");
我遇到的问题是,LINQ 似乎无法通过序列处理 id 生成,因为它在插入时将 id 隐式设置为 0。
- 当我将
id设置为CanBeNull时,插入失败,因为它试图将 NULL 插入到不可为空的字段中。 - 当我将
id设置为IsDbGenerated时,插入工作但它需要IDENTITY字段并尝试使用SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]',N'@p0 int',@p0=1加载生成的ID,然后将对象中的id设置为null,因为SCOPE_IDENTITY()返回null... - 我一直在考虑只使用
IsDbGenerated,销毁 LINQ 对象并在数据库中查询id,但我没有任何独特的东西可以搜索。
不幸的是,将 id 创建机制更改为 IDENTITY 不是一种选择。
我必须explicitly query the DB for the next sequence value 并手动设置 id 吗?
通过 LINQ 处理这些插入的最佳方法是什么?
PS:我需要 id,因为我必须插入更多使用 id 作为 FK 的数据。
【问题讨论】:
标签: c# .net tsql linq-to-sql