Marten自定义序列第二次启动添加失败的解决方案咨询
解决Marten自定义序列重复创建报错的问题
优先使用Marten内置序列支持
Marten本身已经封装了序列的管理逻辑,无需手动通过ExtendedSchemaObjects添加。直接用内置的序列配置,迁移系统会自动检测序列是否存在,不存在才创建:
services.AddMarten(opts => { opts.Connection("你的数据库连接字符串"); // 注册自定义序列 opts.Schema.Sequences.Add("userId_seq", seq => { seq.StartWith(1); seq.IncrementBy(1); }); }) .ApplyAllDatabaseChangesOnStartup();
获取序列值直接用Marten提供的方法:
var nextUserId = await session.NextValAsync("userId_seq");
手动校验序列存在性(若坚持用ExtendedSchemaObjects)
如果一定要通过ExtendedSchemaObjects添加序列,可以先查询PostgreSQL数据库,确认序列不存在时再添加:
services.AddMarten(opts => { opts.Connection("你的数据库连接字符串"); // 检查public schema下是否存在userId_seq using var conn = new NpgsqlConnection(opts.Connection.ConnectionString); conn.Open(); var sequenceExists = conn.ExecuteScalar<bool>( "SELECT EXISTS (SELECT 1 FROM pg_sequences WHERE schemaname = 'public' AND sequencename = 'userId_seq')" ); if (!sequenceExists) { opts.ExtendedSchemaObjects.Add(new Sequence("userId_seq", 1, 1)); } }) .ApplyAllDatabaseChangesOnStartup();
利用PostgreSQL的IF NOT EXISTS语法
直接用SQL脚本创建序列,借助PostgreSQL的IF NOT EXISTS语法避免重复创建报错:
services.AddMarten(opts => { opts.Connection("你的数据库连接字符串"); opts.ExtendedSchemaObjects.Add(new SqlScript("CREATE SEQUENCE IF NOT EXISTS userId_seq START 1 INCREMENT 1;")); }) .ApplyAllDatabaseChangesOnStartup();
内容的提问来源于stack exchange,提问作者Zoltan Hernyak
相关产品推荐
相关产品推荐

