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

使用SQL Server rowversion类型时应选用哪种Typeorm装饰器?

解决TypeORM操作SQL Server rowversion字段插入报错问题

问题原因

SQL Server的rowversion(原timestamp)字段由数据库自动生成和更新,不允许显式插入或修改值,但TypeORM默认会将实体中的该字段值包含在INSERT/UPDATE语句中,导致报错Error: Cannot insert an explicit value into a timestamp column.。

解决方案

方案1:使用@Column配置禁用手动插入/更新

直接通过@Column装饰器配置字段,明确告诉TypeORM不要干预该字段的插入和更新操作:

import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";

@Entity()
export class TargetEntity {
  @PrimaryGeneratedColumn()
  id: number;

  // 正确配置rowversion字段
  @Column({
    type: "rowversion",
    nullable: false,
    insert: false, // 禁止TypeORM在INSERT语句中包含该字段
    update: false, // 禁止TypeORM在UPDATE语句中包含该字段
    select: true, // 允许查询时返回该字段值
  })
  version: Buffer;
}

方案2:配合@VersionColumn实现乐观锁(可选)

如果需要用rowversion实现乐观锁功能,可使用@VersionColumn,但同样要禁用手动插入/更新:

import { Entity, VersionColumn, PrimaryGeneratedColumn } from "typeorm";

@Entity()
export class TargetEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @VersionColumn({
    type: "rowversion",
    nullable: false,
    insert: false,
    update: false,
  })
  version: Buffer;
}

注意事项

  • rowversion字段在TypeORM中会被映射为Buffer类型,查询后可直接使用该值进行乐观锁校验。
  • 无论哪种方案,核心都是让TypeORM放弃对该字段的插入/更新控制,完全交由SQL Server自动维护。

内容的提问来源于stack exchange,提问作者jmc42

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:50:02