【发布时间】:2021-03-17 21:54:51
【问题描述】:
我对 TypeORM 有一个奇怪的问题。对于这个实体:
@Entity({name:"registered_items"})
export class RegisteredItem {
@PrimaryColumn({name: 'itemid', type: 'bigint'})
itemId?: number;
@Column({name: 'somestring', length: 15, nullable: true})
someString?: string;
//.. more strings
@Column({name: 'registertimestamp', nullable: true})
registerTimestamp?: Date;
@Column({name: 'isenabled'})
isEnabled?: boolean;
//..more booleans
}
TypeORM 未能检测到该行已存在与该 itemId 并尝试执行插入而不是更新,
而有了这个更简单的实体:
@Entity({name:"something_simple"})
export class SomethingSimple {
@PrimaryColumn({name: 'thingid', length: 32})
thingId?: string;
@Column({name: 'something', nullable: true, type: "smallint"})
something?: number;
@CreateDateColumn({name: 'inserttimestamp'})
inserttimestamp?: Date;
}
它按预期工作,在项目不存在时执行插入,并在项目存在时更新。为什么它无法与第一个实体一起发挥预期作用? 两种情况下的代码是等价的:
getRepository(RegisteredItem).save(item)
//and:
getRepository(SomethingSimple).save(s)
我可以在调试日志中看到它在确定要采取的操作之前正确执行了 SELECT,但没有从 SELECT 结果中得出正确的结论。
当我手动执行此操作时(而不是 getRepository(..).save().. ):
const exists = await getRepository(RegisteredItem).hasId(item);
if(exists) {
return getRepository(RegisteredItem).update({itemId: item.itemId}, item);
}
else {
return getRepository(RegisteredItem).insert(item);
}
选择了正确的分支。
当尝试使用await getRepository(RegisteredItem).findOne({itemId: <something>}) 预加载实体并尝试保存该实体时,由于主键违规,该操作也会失败。
那么为什么 getRepository.save() 对一个实体不起作用?使用的数据库是 PostgreSQL。
【问题讨论】:
标签: typeorm