You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Fluent Migrator创建带GENERATED ALWAYS标识的PostgreSQL表?

解决方案:Fluent Migrator生成PostgreSQL IDENTITY列而非serial4

问题场景

当前使用Fluent Migrator编写的建表代码:

Create.Table("Players")
    .WithColumn("Id").AsInt32().NotNullable().PrimaryKey().Identity()
    .WithColumn("FirstName").AsString();

生成的SQL默认使用serial4:

CREATE TABLE public.Players (
    id     serial4      NOT NULL,
    "name" varchar(100) NOT NULL,

    CONSTRAINT PK_Players PRIMARY KEY (id)
);

需要生成使用GENERATED ALWAYS AS IDENTITY的SQL:

CREATE TABLE public.Players (
    id     int4         NOT NULL GENERATED ALWAYS AS IDENTITY,
    "name" varchar(100) NOT NULL,

    CONSTRAINT "PK_Players" PRIMARY KEY (id)
);

实现步骤

1. 确保Fluent Migrator版本支持PostgreSQL IDENTITY

使用Fluent Migrator 3.0及以上版本,该版本开始支持PostgreSQL 10+的IDENTITY列语法。

2. 修改建表代码,指定IDENTITY生成策略

调整列定义,显式指定ALWAYS生成策略:

Create.Table("Players")
    .WithColumn("Id").AsInt32().NotNullable().PrimaryKey("PK_Players")
    .Identity(IdentityGenerationStrategy.Always)
    .WithColumn("FirstName").AsString().NotNullable();

如果你的版本支持,也可以用WithIdentityOptions写法:

Create.Table("Players")
    .WithColumn("Id").AsInt32().NotNullable().PrimaryKey("PK_Players")
    .WithIdentityOptions(opt => opt.Always())
    .WithColumn("FirstName").AsString().NotNullable();

3. 配置目标PostgreSQL版本

在服务配置中指定PostgreSQL版本为10.0或更高(IDENTITY是PostgreSQL 10引入的特性):

private static IServiceProvider CreateServices(IConfiguration configuration)
{
    return new ServiceCollection()
        .AddSingleton<IConventionSet>(new DefaultConventionSet(configuration.GetSection("TenantName").Value, null))
        .AddFluentMigratorCore()
            .ConfigureRunner(r => r
                .AddPostgres()
                .SetPostgresVersion(new Version(10, 0)) // 关键:指定PostgreSQL版本
                .WithGlobalConnectionString(configuration.GetConnectionString("DefaultConnection"))
                .WithRunnerConventions(new MigrationRunnerConventions())
                .ScanIn(typeof(Migrations.CoreInitialMigration).Assembly).For.Migrations()
            )
        .BuildServiceProvider(false);
}

4. 验证命名约束(可选)

如果需要保留主键约束的引号(如"PK_Players"),显式指定主键名称即可,避免约定自动转换为小写。

说明

  • 指定PostgreSQL版本后,Fluent Migrator会自动适配对应版本的SQL语法,优先使用IDENTITY替代serial类型。
  • Identity(IdentityGenerationStrategy.Always)直接映射到GENERATED ALWAYS AS IDENTITY语法,确保生成符合预期的SQL。

内容的提问来源于stack exchange,提问作者Prasanna Kumar J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:10:21