关于使用CodeFirst方式在瀚高数据库创建表时自增ID的问题 返回

SqlSugar 沟通中
11 324
该叫什么 sweet 发布于2025/11/20
悬赏:0 飞吻

NET8.0 + 瀚高数据库


NuGet框架版本信息

SqlSugarCore 5.1.4.205

SqlSugar.HGCore 5.1.4.190



问题描述:我在通过CodeFirst方式创建表后,自增ID默认采用了 nextval 这种形式的序列,但是我自增ID采用这种类型(GENERATED ALWAYS AS IDENTITY 或 GENERATED BY DEFAULT AS IDENTITY),我查阅了相关资料,也修改了这种类型,但是发现初始化数据时受到了影响。


以下是我的实现步骤:


1、我的实体

[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }


2、我通过这种方式创建表

hg_db.CodeFirst.InitTables();

3、当我创建成功后,查看瀚高数据库表结构,其中自增ID序列类型如下:

image.png

这种情况不符合我的预期,我是想要这种自增ID类型(GENERATED ALWAYS AS IDENTITY 或 GENERATED BY DEFAULT AS IDENTITY

image.png

4、于是我修改了实体属性后,再次尝试建表

[SugarColumn(IsPrimaryKey = true, ColumnDataType = "integer GENERATED BY DEFAULT AS IDENTITY", ColumnDescription = "主键Id")]
public int Id { get; set; }

此时字段类型正确✅️


image.png

但添加数据时提示了错误

image.png

我再次修改实体属性如下,此时我不重新建表了,仅添加数据,执行成功✅️

[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }


有没有一举两得的方式?我既能得到想要的类型,又不影响初始化数据?

热忱回答11

  • sweet sweet VIP0
    2025/11/20

    刚刚换了个思路,如果我的实体是这样的

    [SugarColumn(IsPrimaryKey = true, ColumnDataType = "integer GENERATED BY DEFAULT AS IDENTITY")]
    public int Id { get; set; }

    我发现使用下面这种方式,是可以成功添加数据的✅️,自增ID表中也是正确的

    var data = hg_db.Insertable(new_list).IgnoreColumns(it => new { it.Id }).ExecuteCommand();


    0 回复
  • fate sta fate sta VIP0
    2025/11/20
    [SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
    public int Id { getset; }


    表删了,直接这样试试。

    0 回复
  • sweet sweet VIP0
    2025/11/20

    @fate sta:我每次建表的时候,都会执行删除表。你这个回复,我试过不行的,类型都是 nextval ,并不是我说的 GENERATED ALWAYS AS IDENTITY 或 GENERATED BY DEFAULT AS IDENTITY。

    0 回复
  • fate sta fate sta VIP0
    2025/11/20
    [SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
    public int Id { getset; }


    这种nextval 方式我记得是可以用的 

    0 回复
  • fate sta fate sta VIP0
    2025/11/20

    新表报什么错。

    0 回复
  • sweet sweet VIP0
    2025/11/21

    @fate sta:我知道可以用nextval ,但是我们要求使用这种类型 GENERATED ALWAYS AS IDENTITY类型

    0 回复
  • fate sta fate sta VIP0
    2025/11/21
    [SugarColumn(IsPrimaryKey = true IsIdentity = true ,ColumnDataType = "integer GENERATED BY DEFAULT AS IDENTITY")]
    public int Id { getset; }

    你这样试一下可以用不,可以用我支持一下配置。

    0 回复
  • sweet sweet VIP0
    2025/11/21

    @fate sta:你说的这种方式我试过了,IsIdentity = trueColumnDataType = "integer GENERATED BY DEFAULT AS IDENTITY" ,这两个属性,不能同时设置,建表的时候会报错的,如下:

    image.png

    您可以亲自试试

    0 回复
  • fate sta fate sta VIP0
    2025/11/21

    @sweet:需供一个线上字符串。我这边来测试。我本地暂时没这个库

    0 回复
  • fate sta fate sta VIP0
    2025/11/21

    SqlSugar.Nhgdb 5.1.4.207


    过五分钟升级到这个版本设置 

    Moresetting里面

    PostgresIdentityStrategy设置为Identity



    0 回复
  • fate sta fate sta VIP0
    2025/11/21
    IsAutoCloseConnection = true,
    DbType = DbType.XXX,
    ConnectionString = Connection,
    MoreSettings = new ConnMoreSettings()
    {
        // 默认是Serial方式实现自增兼容低版本PGSQL,Identity只支较高高版本PGSQL
        PostgresIdentityStrategy = PostgresIdentityStrategy.Identity
    },


    0 回复