当主键列不是标识列时如何插入数据?

Posted

技术标签:

【中文标题】当主键列不是标识列时如何插入数据?【英文标题】:How do I insert data when the primary key column is not an identity column? 【发布时间】:2016-10-24 11:52:54 【问题描述】:

我正在尝试使用 Dapper.Contrib 在主键列不是标识列的表中插入数据。

数据库表是用这个脚本创建的:

begin transaction

create table
    dbo.Foos
    (
        Id int not null,
        Name nvarchar(max) not null
    )
go

alter table
    dbo.Foos
add constraint
    PK_Foos primary key clustered
    (
        Id
    )

go

commit

这是 C# 类:

public class Foo

    public int Id  get; set; 

    public string Name  get; set; 

当像这样插入数据时:

connection.Insert(new Foo()

    Id = 1,
    Name = "name 1"
);

我收到以下错误:

无法将值 NULL 插入到列“Id”、表“FooDatabase.dbo.Foos”中;列不允许空值。插入失败。

按照惯例,Dapper 正确地假定 Id 是主键,但它错误地假定它是一个标识列。如何表明它不是标识列?

【问题讨论】:

【参考方案1】:

您可以按照this issue 使用ExplicitKey 属性。

public class Foo

    [ExplicitKey]
    public int Id  get; set; 

    public string Name  get; set; 

请注意,返回值不是插入项目的 id,因为它通常是当您调用 Insert 时,而是始终是 0

【讨论】:

哎呀!比赛迟到了!谢谢!

以上是关于当主键列不是标识列时如何插入数据?的主要内容,如果未能解决你的问题,请参考以下文章

当主键列是mysql中不同表的外键时,如何将主键列更改为自动递增

为啥我必须在这个插入语句中包含主键列?

将自动增量主键插入现有表

将自动增量主键插入现有表

将自动增量主键插入现有表

Mysql命令整理