如何使用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
相关产品推荐
相关产品推荐

