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

