从零开始自动递增 PK - EF Core 代码优先

Posted

技术标签:

【中文标题】从零开始自动递增 PK - EF Core 代码优先【英文标题】:Auto increment PK starting from zero - EF Core code-first 【发布时间】:2019-01-31 09:41:49 【问题描述】:

我正在使用具有代码优先方法的 ASP.NET Core 和 EF Core。数据库是 SQL Server。是否可以从 0 开始增加 Id 主键?

【问题讨论】:

为什么要从 0 开始? @Shyju 我在特定表中只有 3 行,在 UI 上它们需要分别具有 ID 0、1、2。我知道我可以为 UI 制作另一个 ID 字段并对其进行硬核,但我很好奇我可以不用额外字段。 发布您的代码以及您的期望,因为您的问题的简单答案是肯定的。 我建议不要在这张桌子上使用identity。只是一个普通的Id int primary key,您将使用显式值填充它。 【参考方案1】:

在 EF Core 3.x 中,您可以使用 UseIdentityColumn:

protected override void OnModelCreating(ModelBuilder modelBuilder)

    // ...

    modelBuilder.Entity<Blog>()
        .Property(x => x.Id)
        .UseIdentityColumn(seed: 0, increment: 1);


【讨论】:

【参考方案2】:

是否可以从0开始增加Id主键?

是的。 EF Core 支持Sequences,你可以从任何地方开始。

EG:

class MyContext : DbContext

    public DbSet<Order> Orders  get; set; 

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        modelBuilder.HasSequence<int>("Order_seq", schema: "dbo")
            .StartsAt(0)
            .IncrementsBy(1);

        modelBuilder.Entity<Order>()
            .Property(o => o.OrderNo)
            .HasDefaultValueSql("NEXT VALUE FOR dbo.Order_seq");
    


public class Order

    public int OrderId  get; set; 
    public int OrderNo  get; set; 
    public string Url  get; set; 

https://docs.microsoft.com/en-us/ef/core/modeling/relational/sequences

【讨论】:

如果我是对的,根据这个,我在 Context 类中的所有 DbSet 都将从 0 开始?如果我只想要一个以 0 开头的 DbSet(表)怎么办? 为每个实体创建不同的序列对象。【参考方案3】:

如果您使用 T-SQL 脚本创建表?

您可以按如下方式创建IDENTITY (Property) (Transact-SQL) 列:

语法:

IDENTITY [ (seed , increment ) ]

SQL:

CREATE TABLE (
  ID_column INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
  ...
);

IDENTITY 属性将从数字 1 开始自动递增列。(请注意,列的数据类型应该是整数。)如果要将其添加到现有列,请使用 ALTER TABLE 命令.

【讨论】:

以上是关于从零开始自动递增 PK - EF Core 代码优先的主要内容,如果未能解决你的问题,请参考以下文章

从零开始搭建前后端分离的NetCore(EF Core CodeFirst+Au)+Vue的项目框架之三统一返回数据

EF Core外键配置问题代码优先问题

为什么EF Core无法自动生成ID字段?

从零开始搭建前后端分离的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的项目框架之七使用JWT生成Token(个人见解)

EF Core - 在数据库中按顺序插入记录,PK 上没有标识

从 MySQL 中的现有表生成更改日志时,liquibase 如何处理自动递增的 PK?