从零开始自动递增 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的项目框架之三统一返回数据
从零开始搭建前后端分离的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的项目框架之七使用JWT生成Token(个人见解)